UnmarshalLogMessage to use json.Number (#178)
diff --git a/logging_test.go b/logging_test.go
index de34a24..5ffc044 100644
--- a/logging_test.go
+++ b/logging_test.go
@@ -3,6 +3,7 @@
package tfjson
import (
+ "encoding/json"
"testing"
"time"
@@ -132,7 +133,7 @@
DisplayName: "This is a easy-antelope",
Identity: map[string]any{
"id": "easy-antelope",
- "legs": float64(6),
+ "legs": json.Number("6"),
},
IdentityVersion: 1,
},
diff --git a/logging_types.go b/logging_types.go
index 3e712a0..6f9008c 100644
--- a/logging_types.go
+++ b/logging_types.go
@@ -3,6 +3,7 @@
package tfjson
import (
+ "bytes"
"encoding/json"
)
@@ -29,31 +30,36 @@
}
func unmarshalByType(t LogMessageType, b []byte) (LogMsg, error) {
+ d := json.NewDecoder(bytes.NewReader(b))
+
+ // decode numbers as json.Number to avoid losing precision
+ d.UseNumber()
+
switch t {
// generic
case MessageTypeVersion:
v := VersionLogMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
case MessageTypeLog:
v := LogMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
case MessageTypeDiagnostic:
v := DiagnosticLogMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
// query
case MessageListStart:
v := ListStartMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
case MessageListResourceFound:
v := ListResourceFoundMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
case MessageListComplete:
v := ListCompleteMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
}
v := UnknownLogMessage{}
- return v, json.Unmarshal(b, &v)
+ return v, d.Decode(&v)
}