mstdn/ent.Field
parent
837edc6382
commit
c70db317e0
78
ent/field.go
78
ent/field.go
|
@ -1,34 +1,18 @@
|
||||||
package ent
|
package ent
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
"github.com/reiver/go-erorr"
|
|
||||||
"github.com/reiver/go-opt"
|
"github.com/reiver/go-opt"
|
||||||
"github.com/reiver/go-nul"
|
"github.com/reiver/go-nul"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ json.Marshaler = Field{}
|
|
||||||
var _ json.Unmarshaler = &Field{}
|
|
||||||
|
|
||||||
const (
|
|
||||||
errCannotMashalFieldAsJSONNoName = erorr.Error("cannot marshal ent.Field to JSON — no ‘name’ set")
|
|
||||||
errCannotMashalFieldAsJSONNoValue = erorr.Error("cannot marshal ent.Field to JSON — no ‘value’ set")
|
|
||||||
)
|
|
||||||
|
|
||||||
// Field represents a Mastodon API "Field".
|
// Field represents a Mastodon API "Field".
|
||||||
//
|
//
|
||||||
// See:
|
// See:
|
||||||
// https://docs.joinmastodon.org/entities/Field/
|
// https://docs.joinmastodon.org/entities/Field/
|
||||||
type Field struct {
|
type Field struct {
|
||||||
Name opt.Optional[string]
|
Name opt.Optional[string] `json:"name,omitempty"`
|
||||||
Value opt.Optional[string]
|
Value opt.Optional[string] `json:"value,omitempty"`
|
||||||
VerifiedAt nul.Nullable[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
type field struct {
|
|
||||||
Name opt.Optional[string] `json:"name"`
|
|
||||||
Value opt.Optional[string] `json:"value"`
|
|
||||||
VerifiedAt nul.Nullable[string] `json:"verified_at"`
|
VerifiedAt nul.Nullable[string] `json:"verified_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,6 +20,7 @@ func FieldNameValue(name string, value string) Field {
|
||||||
return Field{
|
return Field{
|
||||||
Name: opt.Something(name),
|
Name: opt.Something(name),
|
||||||
Value: opt.Something(value),
|
Value: opt.Something(value),
|
||||||
|
VerifiedAt: nul.Null[string](),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,60 +31,3 @@ func FieldVerifiedNameValue(when string, name string, value string) Field {
|
||||||
VerifiedAt: nul.Something(when),
|
VerifiedAt: nul.Something(when),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (receiver Field) MarshalJSON() ([]byte, error) {
|
|
||||||
|
|
||||||
var data = map[string]interface{}{}
|
|
||||||
|
|
||||||
{
|
|
||||||
val, found := receiver.Name.Get()
|
|
||||||
if !found {
|
|
||||||
return nil, errCannotMashalFieldAsJSONNoName
|
|
||||||
}
|
|
||||||
|
|
||||||
data["name"] = val
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val, found := receiver.Value.Get()
|
|
||||||
if !found {
|
|
||||||
return nil, errCannotMashalFieldAsJSONNoValue
|
|
||||||
}
|
|
||||||
|
|
||||||
data["value"] = val
|
|
||||||
}
|
|
||||||
{
|
|
||||||
val, found := receiver.VerifiedAt.Get()
|
|
||||||
if !found {
|
|
||||||
data["verified_at"] = nil
|
|
||||||
} else {
|
|
||||||
data["verified_at"] = val
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return json.Marshal(data)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (receiver *Field) UnmarshalJSON(data []byte) error {
|
|
||||||
if nil == receiver {
|
|
||||||
return errNilReceiver
|
|
||||||
}
|
|
||||||
|
|
||||||
var f field
|
|
||||||
|
|
||||||
err := json.Unmarshal(data, &f)
|
|
||||||
if nil != err {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if nul.Null[string]() == f.VerifiedAt {
|
|
||||||
f.VerifiedAt = nul.Nothing[string]()
|
|
||||||
}
|
|
||||||
|
|
||||||
*receiver = Field{
|
|
||||||
Name: f.Name,
|
|
||||||
Value: f.Value,
|
|
||||||
VerifiedAt: f.VerifiedAt,
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
|
||||||
|
|
||||||
|
"github.com/reiver/go-json"
|
||||||
"github.com/reiver/go-mstdn/ent"
|
"github.com/reiver/go-mstdn/ent"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -112,7 +112,7 @@ func TestField_MarshalJSON(t *testing.T) {
|
||||||
|
|
||||||
for testNumber, test := range tests {
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
actualBytes, err := test.Value.MarshalJSON()
|
actualBytes, err := json.Marshal(test.Value)
|
||||||
if nil != err {
|
if nil != err {
|
||||||
t.Errorf("For test #%d, did not expect to get an error but actually got one.", testNumber)
|
t.Errorf("For test #%d, did not expect to get an error but actually got one.", testNumber)
|
||||||
t.Logf("ERROR: (%T) %s", err, err)
|
t.Logf("ERROR: (%T) %s", err, err)
|
||||||
|
|
|
@ -14,10 +14,6 @@ func TestField_UnmarshalJSON(t *testing.T) {
|
||||||
JSON string
|
JSON string
|
||||||
Expected ent.Field
|
Expected ent.Field
|
||||||
}{
|
}{
|
||||||
{
|
|
||||||
JSON: `{"name":"Location","value":"Metro Vancouver"}`,
|
|
||||||
Expected: ent.FieldNameValue("Location", "Metro Vancouver"),
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
JSON: `{"name":"Location","value":"Metro Vancouver", "verified_at":null}`,
|
JSON: `{"name":"Location","value":"Metro Vancouver", "verified_at":null}`,
|
||||||
Expected: ent.FieldNameValue("Location", "Metro Vancouver"),
|
Expected: ent.FieldNameValue("Location", "Metro Vancouver"),
|
||||||
|
|
Loading…
Reference in New Issue