🏷️ Created Lang domain
This commit is contained in:
parent
8d3ef5c7fc
commit
aaaf52cbb8
5
go.mod
5
go.mod
|
@ -2,4 +2,7 @@ module source.toby3d.me/toby3d/jf2
|
|||
|
||||
go 1.21.4
|
||||
|
||||
require golang.org/x/net v0.18.0 // indirect
|
||||
require (
|
||||
golang.org/x/net v0.18.0
|
||||
golang.org/x/text v0.14.0
|
||||
)
|
||||
|
|
2
go.sum
2
go.sum
|
@ -1,2 +1,4 @@
|
|||
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
|
||||
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
package jf2
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
// Lang is the localization language of the containing object and all
|
||||
// sub-objects, unless overridden by another lang definition. Setting lang at a
|
||||
// lower level overrides any lang value set at higher levels.
|
||||
type Lang struct {
|
||||
language.Tag
|
||||
}
|
||||
|
||||
func (l *Lang) UnmarshalJSON(v []byte) error {
|
||||
unquoted, err := strconv.Unquote(string(v))
|
||||
if err != nil {
|
||||
return fmt.Errorf("JF2: Lang: cannot unquote value: %w", err)
|
||||
}
|
||||
|
||||
parsed, err := language.Parse(unquoted)
|
||||
if err != nil {
|
||||
return fmt.Errorf("JF2: Lang: cannot parse value as language tag: %w", err)
|
||||
}
|
||||
|
||||
l.Tag = parsed
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (l Lang) MarshalJSON() ([]byte, error) {
|
||||
if l.Tag != language.Und {
|
||||
return []byte(strconv.Quote(l.Tag.String())), nil
|
||||
}
|
||||
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
func (l Lang) String() string {
|
||||
return l.Tag.String()
|
||||
}
|
||||
|
||||
func (l Lang) GoString() string {
|
||||
return "jf2.Lang(" + l.String() + ")"
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package jf2_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"source.toby3d.me/toby3d/jf2"
|
||||
)
|
||||
|
||||
func TestLang_UnmarshalJSON(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
v := new(struct {
|
||||
Lang jf2.Lang `json:"lang"`
|
||||
})
|
||||
if err := json.Unmarshal([]byte(`{"lang":"en-US"}`), v); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
expect := language.AmericanEnglish
|
||||
if v.Lang.Tag != expect {
|
||||
t.Errorf("got '%s', want '%s'", v.Lang.Tag, expect)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLang_MarshalJSON(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
body, err := json.Marshal(struct {
|
||||
Lang jf2.Lang `json:"lang"`
|
||||
}{
|
||||
Lang: jf2.Lang{Tag: language.AmericanEnglish},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
const expect string = `{"lang":"en-US"}`
|
||||
if actual := string(body); actual != expect {
|
||||
t.Errorf("got '%s', want '%s'", actual, expect)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue