mstdn/ent.Status.MarshalJSON()
							parent
							
								
									8556552b0f
								
							
						
					
					
						commit
						d8b920bae5
					
				| 
						 | 
				
			
			@ -6,4 +6,5 @@ import (
 | 
			
		|||
 | 
			
		||||
const (
 | 
			
		||||
	errNilReceiver = erorr.Error("mstdn/ent: nil receiver")
 | 
			
		||||
	errNothingID   = erorr.Error("mstdn/ent: nothing id")
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										296
									
								
								ent/status.go
								
								
								
								
							
							
						
						
									
										296
									
								
								ent/status.go
								
								
								
								
							| 
						 | 
				
			
			@ -3,6 +3,7 @@ package ent
 | 
			
		|||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"github.com/reiver/go-erorr"
 | 
			
		||||
	"github.com/reiver/go-jsonint"
 | 
			
		||||
	"github.com/reiver/go-opt"
 | 
			
		||||
	"github.com/reiver/go-nul"
 | 
			
		||||
| 
						 | 
				
			
			@ -41,3 +42,298 @@ type Status struct {
 | 
			
		|||
	Pinned             opt.Optional[bool]        `json:"pinned"`
 | 
			
		||||
	Filtered           json.RawMessage           `json:"filtered"`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (receiver *Status) MarshalJSON() ([]byte, error) {
 | 
			
		||||
	if nil == receiver {
 | 
			
		||||
		return nil, errNilReceiver
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var buffer [1024]byte
 | 
			
		||||
	var p []byte = buffer[0:0]
 | 
			
		||||
 | 
			
		||||
	p = append(p, '{')
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found := receiver.ID.Get()
 | 
			
		||||
		if !found {
 | 
			
		||||
			return nil, errNothingID
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const name =    "id"
 | 
			
		||||
		p  = append(p, `"id":`...)
 | 
			
		||||
 | 
			
		||||
		bytes, err := json.Marshal(val)
 | 
			
		||||
		if nil != err {
 | 
			
		||||
			return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		p = append(p, bytes...)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.URI.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "uri"
 | 
			
		||||
			p  = append(p, `,"uri":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.URL.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "url"
 | 
			
		||||
			p  = append(p, `,"url":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.CreatedAt.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "created_at"
 | 
			
		||||
			p  = append(p, `,"created_at":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
//@TODO: Account
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Content.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "content"
 | 
			
		||||
			p  = append(p, `,"content":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Visibility.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "visibility"
 | 
			
		||||
			p  = append(p, `,"visibility":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Sensitive.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "sensitive"
 | 
			
		||||
			p  = append(p, `,"sensitive":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.SpoilerText.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "spoiler_text"
 | 
			
		||||
			p  = append(p, `,"spoiler_text":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
//@TODO: MediaAttachments
 | 
			
		||||
 | 
			
		||||
//@TODO: Application
 | 
			
		||||
 | 
			
		||||
//@TODO: Mentions
 | 
			
		||||
 | 
			
		||||
//@TODO: Tags
 | 
			
		||||
 | 
			
		||||
//@TODO: Emojis
 | 
			
		||||
 | 
			
		||||
//@TODO: ReblogsCount
 | 
			
		||||
 | 
			
		||||
//@TODO: FavouritesCount
 | 
			
		||||
 | 
			
		||||
//@TODO: RepliesCount
 | 
			
		||||
 | 
			
		||||
//@TODO: InReplyToID
 | 
			
		||||
 | 
			
		||||
//@TODO: InReplyToAccountID
 | 
			
		||||
 | 
			
		||||
//@TODO: Reblog
 | 
			
		||||
 | 
			
		||||
//@TODO: Poll
 | 
			
		||||
 | 
			
		||||
//@TODO: Card
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Language.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "language"
 | 
			
		||||
			p  = append(p, `,"language":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Text.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "text"
 | 
			
		||||
			p  = append(p, `,"text":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.EditedAt.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "edited_at"
 | 
			
		||||
			p  = append(p, `,"edited_at":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Favourited.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "favourited"
 | 
			
		||||
			p  = append(p, `,"favourited":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Reblogged.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "reblogged"
 | 
			
		||||
			p  = append(p, `,"reblogged":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Muted.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "muted"
 | 
			
		||||
			p  = append(p, `,"muted":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Bookmarked.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "bookmarked"
 | 
			
		||||
			p  = append(p, `,"bookmarked":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		val, found :=    receiver.Pinned.Get()
 | 
			
		||||
		if found {
 | 
			
		||||
			const name =     "pinned"
 | 
			
		||||
			p  = append(p, `,"pinned":`...)
 | 
			
		||||
 | 
			
		||||
			bytes, err := json.Marshal(val)
 | 
			
		||||
			if nil != err {
 | 
			
		||||
				return nil, erorr.Errorf("problem marshaling %q: %w", name, err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		bytes :=  []byte(receiver.Filtered)
 | 
			
		||||
		if 0 < len(bytes) {
 | 
			
		||||
			const name =     "filtered"
 | 
			
		||||
			p  = append(p, `,"filtered":`...)
 | 
			
		||||
 | 
			
		||||
			p = append(p, bytes...)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	p = append(p, '}')
 | 
			
		||||
 | 
			
		||||
	return p, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,180 @@
 | 
			
		|||
package ent
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
 | 
			
		||||
	"github.com/reiver/go-nul"
 | 
			
		||||
	"github.com/reiver/go-opt"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestStatus_JSON(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	tests := []struct{
 | 
			
		||||
			Status Status
 | 
			
		||||
			Expected string
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123"}`,
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				URI: nul.Something("https://example.com/status/123"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","uri":"https://example.com/status/123"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				URL: nul.Something("https://example.com/@joeblow/status/123"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","url":"https://example.com/@joeblow/status/123"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				CreatedAt: opt.Something("yesterday"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","created_at":"yesterday"}`,
 | 
			
		||||
		},
 | 
			
		||||
//@TODO: Account
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Content: opt.Something("Hello world!"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","content":"Hello world!"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Visibility: opt.Something("public"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","visibility":"public"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Sensitive: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","sensitive":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				SpoilerText: opt.Something("the rabbit did it"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","spoiler_text":"the rabbit did it"}`,
 | 
			
		||||
		},
 | 
			
		||||
//@TODO: MediaAttachments
 | 
			
		||||
//@TODO: Application
 | 
			
		||||
//@TODO: Mentions
 | 
			
		||||
//@TODO: Tags
 | 
			
		||||
//@TODO: Emojis
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Language: nul.Something("en"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","language":"en"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Text: nul.Something("bing bong bang"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","text":"bing bong bang"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				EditedAt: nul.Something("today"),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","edited_at":"today"}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Favourited: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","favourited":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Reblogged: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","reblogged":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Muted: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","muted":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Bookmarked: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","bookmarked":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Pinned: opt.Something(true),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","pinned":true}`,
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Status:Status{
 | 
			
		||||
				ID: opt.Something("123"),
 | 
			
		||||
				Filtered: json.RawMessage([]byte(`{"once":1,"twice":2,"thrice":3,"fource":4}`)),
 | 
			
		||||
			},
 | 
			
		||||
			Expected: `{"id":"123","filtered":{"once":1,"twice":2,"thrice":3,"fource":4}}`,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for testNumber, test := range tests {
 | 
			
		||||
 | 
			
		||||
		actualBytes, err := json.Marshal(&test.Status)
 | 
			
		||||
 | 
			
		||||
		if nil != err {
 | 
			
		||||
			t.Errorf("For test #%d, did not expect to get an error but actually did.", testNumber)
 | 
			
		||||
			t.Logf("ERROR: (%T) %s", err, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		actual := string(actualBytes)
 | 
			
		||||
 | 
			
		||||
		expected := test.Expected
 | 
			
		||||
 | 
			
		||||
		if expected != actual {
 | 
			
		||||
			t.Errorf("For test #%d, the actual string-serialized form is not what was expected.", testNumber)
 | 
			
		||||
			t.Logf("EXPECTED: %q", expected)
 | 
			
		||||
			t.Logf("ACTUAL:   %q", actual)
 | 
			
		||||
			t.Logf("EXPECTED:\n%s", expected)
 | 
			
		||||
			t.Logf("ACTUAL:\n%s", actual)
 | 
			
		||||
			t.Logf("STATUS:\n%v", test.Status)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue