Source File
yaml.go
Belonging Package
gopkg.in/yaml.v2
package yaml
import (
)
type Unmarshaler interface {
UnmarshalYAML(unmarshal func(interface{}) error) error
}
func ( *Decoder) ( interface{}) ( error) {
:= newDecoder(.strict)
defer handleErr(&)
:= .parser.parse()
if == nil {
return io.EOF
}
:= reflect.ValueOf()
if .Kind() == reflect.Ptr && !.IsNil() {
= .Elem()
}
.unmarshal(, )
if len(.terrors) > 0 {
return &TypeError{.terrors}
}
return nil
}
func ( []byte, interface{}, bool) ( error) {
defer handleErr(&)
:= newDecoder()
:= newParser()
defer .destroy()
:= .parse()
if != nil {
:= reflect.ValueOf()
if .Kind() == reflect.Ptr && !.IsNil() {
= .Elem()
}
.unmarshal(, )
}
if len(.terrors) > 0 {
return &TypeError{.terrors}
}
return nil
}
func ( interface{}) ( []byte, error) {
defer handleErr(&)
:= newEncoder()
defer .destroy()
.marshalDoc("", reflect.ValueOf())
.finish()
= .out
return
}
func ( *Encoder) () ( error) {
defer handleErr(&)
.encoder.finish()
return nil
}
func ( *error) {
if := recover(); != nil {
if , := .(yamlError); {
* = .err
} else {
panic()
}
}
}
type yamlError struct {
err error
}
func ( error) {
panic(yamlError{})
}
func ( string, ...interface{}) {
panic(yamlError{fmt.Errorf("yaml: "+, ...)})
}
type structInfo struct {
FieldsMap map[string]fieldInfo
FieldsList []fieldInfo
Inline []int
}
var structMap = make(map[reflect.Type]*structInfo)
var fieldMapMutex sync.RWMutex
func ( reflect.Type) (*structInfo, error) {
fieldMapMutex.RLock()
, := structMap[]
fieldMapMutex.RUnlock()
if {
return , nil
}
:= .NumField()
:= make(map[string]fieldInfo)
:= make([]fieldInfo, 0, )
:= -1
for := 0; != ; ++ {
:= .Field()
if .PkgPath != "" && !.Anonymous {
continue // Private field
}
:= fieldInfo{Num: }
:= .Tag.Get("yaml")
if == "" && strings.Index(string(.Tag), ":") < 0 {
= string(.Tag)
}
if == "-" {
continue
}
:= false
:= strings.Split(, ",")
if len() > 1 {
for , := range [1:] {
switch {
case "omitempty":
.OmitEmpty = true
case "flow":
.Flow = true
case "inline":
= true
default:
return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", , , ))
}
}
= [0]
}
if {
switch .Type.Kind() {
case reflect.Map:
if >= 0 {
return nil, errors.New("Multiple ,inline maps in struct " + .String())
}
if .Type.Key() != reflect.TypeOf("") {
return nil, errors.New("Option ,inline needs a map with string keys in struct " + .String())
}
= .Num
case reflect.Struct:
, := (.Type)
if != nil {
return nil,
}
for , := range .FieldsList {
if , := [.Key]; {
:= "Duplicated key '" + .Key + "' in struct " + .String()
return nil, errors.New()
}
if .Inline == nil {
.Inline = []int{, .Num}
} else {
.Inline = append([]int{}, .Inline...)
}
.Id = len()
[.Key] =
= append(, )
}
return nil, errors.New("Option ,inline needs a struct value field")
}
continue
}
if != "" {
.Key =
} else {
.Key = strings.ToLower(.Name)
}
if _, = [.Key]; {
:= "Duplicated key '" + .Key + "' in struct " + .String()
return nil, errors.New()
}
.Id = len()
= append(, )
[.Key] =
}
= &structInfo{
FieldsMap: ,
FieldsList: ,
InlineMap: ,
}
fieldMapMutex.Lock()
structMap[] =
fieldMapMutex.Unlock()
return , nil
}
type IsZeroer interface {
IsZero() bool
}
func ( reflect.Value) bool {
:= .Kind()
if , := .Interface().(IsZeroer); {
if ( == reflect.Ptr || == reflect.Interface) && .IsNil() {
return true
}
return .IsZero()
}
switch {
case reflect.String:
return len(.String()) == 0
case reflect.Interface, reflect.Ptr:
return .IsNil()
case reflect.Slice:
return .Len() == 0
case reflect.Map:
return .Len() == 0
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return .Int() == 0
case reflect.Float32, reflect.Float64:
return .Float() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return .Uint() == 0
case reflect.Bool:
return !.Bool()
case reflect.Struct:
:= .Type()
for := .NumField() - 1; >= 0; -- {
if .Field().PkgPath != "" {
continue // Private field
}
if !(.Field()) {
return false
}
}
return true
}
return false
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |