From 4d7e181f9f8afdb17a4de402933c1c275f1f5326 Mon Sep 17 00:00:00 2001 From: Tao Wen Date: Thu, 26 Jan 2017 14:56:31 +0800 Subject: [PATCH] implement Any WriteTo --- feature_any.go | 3 --- feature_any_array.go | 14 +++++++++++--- feature_any_bool.go | 8 ++++++++ feature_any_float.go | 4 ++++ feature_any_int.go | 2 +- feature_any_invalid.go | 3 +++ feature_any_nil.go | 6 +++++- feature_any_object.go | 2 +- feature_any_string.go | 4 ++++ jsoniter_array_test.go | 1 + 10 files changed, 38 insertions(+), 9 deletions(-) diff --git a/feature_any.go b/feature_any.go index 136858f..297a82c 100644 --- a/feature_any.go +++ b/feature_any.go @@ -59,9 +59,6 @@ func (any *baseAny) SetObject(map[string]Any) bool { return false } -func (any *baseAny) WriteTo(stream *Stream) { -} - func WrapInt64(val int64) Any { return &intAny{baseAny{}, nil, val} } diff --git a/feature_any_array.go b/feature_any_array.go index fec726d..71c9bb4 100644 --- a/feature_any_array.go +++ b/feature_any_array.go @@ -95,7 +95,7 @@ func (any *arrayLazyAny) fillCache() { } func (any *arrayLazyAny) LastError() error { - return nil + return any.err } func (any *arrayLazyAny) ToBool() bool { @@ -156,7 +156,15 @@ func (any *arrayLazyAny) ToFloat64() float64 { } func (any *arrayLazyAny) ToString() string { - return "" + if len(any.remaining) == len(any.buf) { + // nothing has been parsed yet + return *(*string)(unsafe.Pointer(&any.buf)) + } else { + any.fillCache() + str, err := MarshalToString(any.cache) + any.err = err + return str + } } func (any *arrayLazyAny) Get(path ...interface{}) Any { @@ -252,7 +260,7 @@ func (any *arrayLazyAny) SetArray(newList []Any) bool { func (any *arrayLazyAny) WriteTo(stream *Stream) { if len(any.remaining) == len(any.buf) { // nothing has been parsed yet - stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf))) + stream.Write(any.buf) } else { any.fillCache() stream.WriteVal(any.cache) diff --git a/feature_any_bool.go b/feature_any_bool.go index ab914de..4aa6444 100644 --- a/feature_any_bool.go +++ b/feature_any_bool.go @@ -36,6 +36,10 @@ func (any *trueAny) ToString() string { return "true" } +func (any *trueAny) WriteTo(stream *Stream) { + stream.WriteTrue() +} + type falseAny struct { baseAny } @@ -71,3 +75,7 @@ func (any *falseAny) ToFloat64() float64 { func (any *falseAny) ToString() string { return "false" } + +func (any *falseAny) WriteTo(stream *Stream) { + stream.WriteFalse() +} diff --git a/feature_any_float.go b/feature_any_float.go index c975177..f9e14da 100644 --- a/feature_any_float.go +++ b/feature_any_float.go @@ -64,4 +64,8 @@ func (any *floatLazyAny) ToFloat64() float64 { func (any *floatLazyAny) ToString() string { return *(*string)(unsafe.Pointer(&any.buf)) +} + +func (any *floatLazyAny) WriteTo(stream *Stream) { + stream.Write(any.buf) } \ No newline at end of file diff --git a/feature_any_int.go b/feature_any_int.go index 8b325bb..c107f43 100644 --- a/feature_any_int.go +++ b/feature_any_int.go @@ -68,7 +68,7 @@ func (any *intLazyAny) ToString() string { } func (any *intLazyAny) WriteTo(stream *Stream) { - stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf))) + stream.Write(any.buf) } type intAny struct { diff --git a/feature_any_invalid.go b/feature_any_invalid.go index cb03597..207fcae 100644 --- a/feature_any_invalid.go +++ b/feature_any_invalid.go @@ -36,6 +36,9 @@ func (any *invalidAny) ToString() string { return "" } +func (any *invalidAny) WriteTo(stream *Stream) { +} + func (any *invalidAny) Get(path ...interface{}) Any { return any } diff --git a/feature_any_nil.go b/feature_any_nil.go index 5a36f05..cb06276 100644 --- a/feature_any_nil.go +++ b/feature_any_nil.go @@ -33,5 +33,9 @@ func (any *nilAny) ToFloat64() float64 { } func (any *nilAny) ToString() string { - return "" + return "nil" +} + +func (any *nilAny) WriteTo(stream *Stream) { + stream.WriteNil() } \ No newline at end of file diff --git a/feature_any_object.go b/feature_any_object.go index 43e0ddc..adf0552 100644 --- a/feature_any_object.go +++ b/feature_any_object.go @@ -277,7 +277,7 @@ func (any *objectLazyAny) SetObject(val map[string]Any) bool { func (any *objectLazyAny) WriteTo(stream *Stream) { if len(any.remaining) == len(any.buf) { // nothing has been parsed yet - stream.WriteRaw(*(*string)(unsafe.Pointer(&any.buf))) + stream.Write(any.buf) } else { any.fillCache() stream.WriteVal(any.cache) diff --git a/feature_any_string.go b/feature_any_string.go index 3045c7a..0399eb1 100644 --- a/feature_any_string.go +++ b/feature_any_string.go @@ -96,4 +96,8 @@ func (any *stringLazyAny) ToFloat64() float64 { func (any *stringLazyAny) ToString() string { any.fillCache() return any.cache +} + +func (any *stringLazyAny) WriteTo(stream *Stream) { + stream.Write(any.buf) } \ No newline at end of file diff --git a/jsoniter_array_test.go b/jsoniter_array_test.go index aa5672c..b5feed3 100644 --- a/jsoniter_array_test.go +++ b/jsoniter_array_test.go @@ -87,6 +87,7 @@ func Test_array_lazy_any_get(t *testing.T) { any, err := UnmarshalAnyFromString("[1,[2,3],4]") should.Nil(err) should.Equal(3, any.Get(1,1).ToInt()) + should.Equal("[1,[2,3],4]", any.ToString()) } func Test_array_lazy_any_set(t *testing.T) {