Files
nostrlib/nip05/nip05_easyjson.go
2025-12-14 09:18:18 -03:00

288 lines
6.0 KiB
Go

package nip05
import (
json "encoding/json"
"errors"
"unsafe"
nostr "fiatjaf.com/nostr"
easyjson "github.com/mailru/easyjson"
jlexer "github.com/mailru/easyjson/jlexer"
jwriter "github.com/mailru/easyjson/jwriter"
)
// suppress unused package warning
var (
_ *json.RawMessage
_ *jlexer.Lexer
_ *jwriter.Writer
_ easyjson.Marshaler
)
func easyjsonDecode(in *jlexer.Lexer, out *WellKnownResponse) {
isTopLevel := in.IsStart()
if in.IsNull() {
if isTopLevel {
in.Consumed()
}
in.Skip()
return
}
in.Delim('{')
for !in.IsDelim('}') {
key := in.UnsafeFieldName(false)
in.WantColon()
if in.IsNull() {
in.Skip()
in.WantComma()
continue
}
switch key {
case "names":
if in.IsNull() {
in.Skip()
} else {
in.Delim('{')
out.Names = make(map[string]nostr.PubKey)
for !in.IsDelim('}') {
key := string(in.String())
in.WantColon()
var pk nostr.PubKey
if data := in.Raw(); in.Ok() {
var err error
if len(data) < 2 {
err = errors.New("names[]{pubkey} must be a string")
} else {
data = data[1 : len(data)-1]
pk, err = nostr.PubKeyFromHex(unsafe.String(unsafe.SliceData(data), len(data)))
}
in.AddError(err)
}
out.Names[key] = pk
in.WantComma()
}
in.Delim('}')
}
case "relays":
if in.IsNull() {
in.Skip()
} else {
in.Delim('{')
if !in.IsDelim('}') {
out.Relays = make(map[nostr.PubKey][]string)
} else {
out.Relays = nil
}
for !in.IsDelim('}') {
var key nostr.PubKey
if data := in.Raw(); in.Ok() {
var err error
if len(data) < 2 {
err = errors.New("relays[pubkey] must be a string")
} else {
data = data[1 : len(data)-1]
key, err = nostr.PubKeyFromHex(unsafe.String(unsafe.SliceData(data), len(data)))
}
in.AddError(err)
}
in.WantColon()
var relays []string
if in.IsNull() {
in.Skip()
relays = nil
} else {
in.Delim('[')
if relays == nil {
if !in.IsDelim(']') {
relays = make([]string, 0, 4)
} else {
relays = []string{}
}
} else {
relays = (relays)[:0]
}
for !in.IsDelim(']') {
relays = append(relays, string(in.String()))
in.WantComma()
}
in.Delim(']')
}
out.Relays[key] = relays
in.WantComma()
}
in.Delim('}')
}
case "nip46":
if in.IsNull() {
in.Skip()
} else {
in.Delim('{')
if !in.IsDelim('}') {
out.NIP46 = make(map[nostr.PubKey][]string)
} else {
out.NIP46 = nil
}
for !in.IsDelim('}') {
var key nostr.PubKey
if data := in.Raw(); in.Ok() {
var err error
if len(data) < 2 {
err = errors.New("nip46[pubkey] must be a string")
} else {
data = data[1 : len(data)-1]
key, err = nostr.PubKeyFromHex(unsafe.String(unsafe.SliceData(data), len(data)))
}
in.AddError(err)
}
in.WantColon()
var bunkers []string
if in.IsNull() {
in.Skip()
bunkers = nil
} else {
in.Delim('[')
if bunkers == nil {
if !in.IsDelim(']') {
bunkers = make([]string, 0, 4)
} else {
bunkers = []string{}
}
} else {
bunkers = (bunkers)[:0]
}
for !in.IsDelim(']') {
var bunker string
bunker = string(in.String())
bunkers = append(bunkers, bunker)
in.WantComma()
}
in.Delim(']')
}
out.NIP46[key] = bunkers
in.WantComma()
}
in.Delim('}')
}
default:
in.SkipRecursive()
}
in.WantComma()
}
in.Delim('}')
if isTopLevel {
in.Consumed()
}
}
func easyjsonEncode(out *jwriter.Writer, in WellKnownResponse) {
out.RawByte('{')
first := true
_ = first
{
const prefix string = ",\"names\":"
out.RawString(prefix[1:])
if in.Names == nil && (out.Flags&jwriter.NilMapAsEmpty) == 0 {
out.RawString(`null`)
} else {
out.RawByte('{')
isFirst := true
for name, pk := range in.Names {
if isFirst {
isFirst = false
} else {
out.RawByte(',')
}
out.String(name)
out.RawByte(':')
out.String(pk.Hex())
}
out.RawByte('}')
}
}
if len(in.Relays) != 0 {
const prefix string = ",\"relays\":"
out.RawString(prefix)
{
out.RawByte('{')
isFirst := true
for pk, relays := range in.Relays {
if isFirst {
isFirst = false
} else {
out.RawByte(',')
}
out.String(pk.Hex())
out.RawByte(':')
if relays == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 {
out.RawString("null")
} else {
out.RawByte('[')
for i, relay := range relays {
if i > 0 {
out.RawByte(',')
}
out.String(relay)
}
out.RawByte(']')
}
}
out.RawByte('}')
}
}
if len(in.NIP46) != 0 {
const prefix string = ",\"nip46\":"
out.RawString(prefix)
{
out.RawByte('{')
isFirst := true
for pk, bunkers := range in.NIP46 {
if isFirst {
isFirst = false
} else {
out.RawByte(',')
}
out.String(pk.Hex())
out.RawByte(':')
if bunkers == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 {
out.RawString("null")
} else {
out.RawByte('[')
for i, bunker := range bunkers {
if i > 0 {
out.RawByte(',')
}
out.String(bunker)
}
out.RawByte(']')
}
}
out.RawByte('}')
}
}
out.RawByte('}')
}
// MarshalJSON supports json.Marshaler interface
func (v WellKnownResponse) MarshalJSON() ([]byte, error) {
w := jwriter.Writer{}
easyjsonEncode(&w, v)
return w.Buffer.BuildBytes(), w.Error
}
// MarshalEasyJSON supports easyjson.Marshaler interface
func (v WellKnownResponse) MarshalEasyJSON(w *jwriter.Writer) {
easyjsonEncode(w, v)
}
// UnmarshalJSON supports json.Unmarshaler interface
func (v *WellKnownResponse) UnmarshalJSON(data []byte) error {
r := jlexer.Lexer{Data: data}
easyjsonDecode(&r, v)
return r.Error()
}
// UnmarshalEasyJSON supports easyjson.Unmarshaler interface
func (v *WellKnownResponse) UnmarshalEasyJSON(l *jlexer.Lexer) {
easyjsonDecode(l, v)
}