72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
|
package stringutils
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// StrSlice representes a string or an array of strings.
|
||
|
// We need to override the json decoder to accept both options.
|
||
|
type StrSlice struct {
|
||
|
parts []string
|
||
|
}
|
||
|
|
||
|
// MarshalJSON Marshals (or serializes) the StrSlice into the json format.
|
||
|
// This method is needed to implement json.Marshaller.
|
||
|
func (e *StrSlice) MarshalJSON() ([]byte, error) {
|
||
|
if e == nil {
|
||
|
return []byte{}, nil
|
||
|
}
|
||
|
return json.Marshal(e.Slice())
|
||
|
}
|
||
|
|
||
|
// UnmarshalJSON decodes the byte slice whether it's a string or an array of strings.
|
||
|
// This method is needed to implement json.Unmarshaler.
|
||
|
func (e *StrSlice) UnmarshalJSON(b []byte) error {
|
||
|
if len(b) == 0 {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
p := make([]string, 0, 1)
|
||
|
if err := json.Unmarshal(b, &p); err != nil {
|
||
|
var s string
|
||
|
if err := json.Unmarshal(b, &s); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
p = append(p, s)
|
||
|
}
|
||
|
|
||
|
e.parts = p
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Len returns the number of parts of the StrSlice.
|
||
|
func (e *StrSlice) Len() int {
|
||
|
if e == nil {
|
||
|
return 0
|
||
|
}
|
||
|
return len(e.parts)
|
||
|
}
|
||
|
|
||
|
// Slice gets the parts of the StrSlice as a Slice of string.
|
||
|
func (e *StrSlice) Slice() []string {
|
||
|
if e == nil {
|
||
|
return nil
|
||
|
}
|
||
|
return e.parts
|
||
|
}
|
||
|
|
||
|
// ToString gets space separated string of all the parts.
|
||
|
func (e *StrSlice) ToString() string {
|
||
|
s := e.Slice()
|
||
|
if s == nil {
|
||
|
return ""
|
||
|
}
|
||
|
return strings.Join(s, " ")
|
||
|
}
|
||
|
|
||
|
// NewStrSlice creates an StrSlice based on the specified parts (as strings).
|
||
|
func NewStrSlice(parts ...string) *StrSlice {
|
||
|
return &StrSlice{parts}
|
||
|
}
|