1
0
Fork 0

🏷️ Created Lang domain

This commit is contained in:
Maxim Lebedev 2023-11-26 01:23:27 +06:00
parent 8d3ef5c7fc
commit aaaf52cbb8
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
4 changed files with 97 additions and 1 deletions

5
go.mod
View File

@ -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
View File

@ -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=

47
lang.go Normal file
View File

@ -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() + ")"
}

44
lang_test.go Normal file
View File

@ -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)
}
}