gob/collection/json/convert.go

107 lines
3.1 KiB
Go
Raw Normal View History

2023-09-23 18:11:25 +00:00
package json
import (
j "encoding/json"
"io"
. "gitea.zaclys.com/bvaudour/gob/option"
)
// JsonDecoder permet de parser une entrée brute en un objet Json ou un tableau de Json.
type JsonDecoder struct {
d *j.Decoder
}
// NewJsonDecoder retourne un décodeur pour la donnée dentrée spécifiée.
func NewJsonDecoder(r io.Reader) *JsonDecoder { return &JsonDecoder{d: j.NewDecoder(r)} }
// Decode retourne un objet Json décodé.
func (dec *JsonDecoder) Decode() Result[Json] {
o := make(Json)
if err := dec.d.Decode(&o); err != nil {
return Err[Json](err)
}
return Ok(o)
}
// DecodeSlice retourne un tableau de Json décodé.
func (dec *JsonDecoder) DecodeSlice() Result[Slice] {
var sl Slice
if err := dec.d.Decode(&sl); err != nil {
return Err[Slice](err)
}
return Ok(sl)
}
// Decode décode une entrée brute et la fusionne avec lobjet Json.
func (o Json) Decode(r io.Reader) Result[Json] {
dec := NewJsonDecoder(r)
result := dec.Decode()
if o2, ok := result.Ok(); ok {
o = o.Fusion(o2)
return Ok(o)
}
return result
}
// Decode décode une entrée brute et la fusionne avec le tableau de Json.
func (sl *Slice) Decode(r io.Reader) Result[Slice] {
dec := NewJsonDecoder(r)
result := dec.DecodeSlice()
if sl2, ok := result.Ok(); ok {
return Ok(sl.Add(sl2...))
}
return result
}
// JsonEncoder permet de convertir un objet Json ou un tableau de Json au format brut.
type JsonEncoder struct {
e *j.Encoder
}
// NewJsonEncoder fournit un encodeur pour la sortie fournie.
func NewJsonEncoder(w io.Writer) *JsonEncoder { return &JsonEncoder{e: j.NewEncoder(w)} }
// Encode encode un objet Json.
func (enc *JsonEncoder) Encode(o Json) error { return enc.e.Encode(o) }
// EncodeSlice encode un tableau Json.
func (enc *JsonEncoder) EncodeSlice(sl Slice) error { return enc.e.Encode(sl) }
// SetEscapeHTML configure lencodeur pour que les caractère HTML soient échappés si on est vrai.
// Ainsi, les caractères &, <, et > sont transformés respectivement en \u0026, \u003c et \u003e
// Cela permet déviter des problèmes de sécurité lorsque du html est embarqué dans du Json.
func (enc *JsonEncoder) SetEscapeHTML(on bool) { enc.e.SetEscapeHTML(on) }
// SetIndent définit le préfixe et lindentation du Json à la sortie.
// Cela permet de rendre un Json dans un format lisible (ie. non minifié).
func (enc *JsonEncoder) SetIndent(prefix, indent string) { enc.e.SetIndent(prefix, indent) }
// Encode minifie le Json dans la sortie donnée.
func (o Json) Encode(w io.Writer) error {
enc := NewJsonEncoder(w)
return enc.Encode(o)
}
// EncodeHuman encode le Json dans un format humainement lisible (indentation de deux espaces).
func (o Json) EncodeHuman(w io.Writer) error {
enc := NewJsonEncoder(w)
enc.SetIndent("", " ")
return enc.Encode(o)
}
// Encode minifie le tableau de Json dans la sortie donnée.
func (sl Slice) Encode(w io.Writer) error {
enc := NewJsonEncoder(w)
return enc.EncodeSlice(sl)
}
// EncodeHuman encode le tableau de Json dans un format humainement lisible (indentation de deux espaces).
func (sl Slice) EncodeHuman(w io.Writer) error {
enc := NewJsonEncoder(w)
enc.SetIndent("", " ")
return enc.EncodeSlice(sl)
}