105 lines
2.1 KiB
Go
105 lines
2.1 KiB
Go
package goap
|
|
|
|
// Helper type for parsing attributes where the value (after expansion) is of the following form
|
|
// ```json
|
|
// [
|
|
//
|
|
// {
|
|
// "@id": "some url here"
|
|
// }
|
|
//
|
|
// ]
|
|
// ```
|
|
type FullIdType struct {
|
|
Next BaseApChain
|
|
Id string
|
|
}
|
|
|
|
func (idtype *FullIdType) GetSelfOrBase() (BaseApChain, bool) {
|
|
return idtype.Next, true
|
|
}
|
|
|
|
func (idtype *FullIdType) MarshalToMapWithName(name string) map[string]any {
|
|
m := idtype.Next.MarshalToMap()
|
|
if m == nil {
|
|
m = map[string]any{}
|
|
}
|
|
m[name] = []map[string]any{{KEY_ID: idtype.Id}}
|
|
return m
|
|
}
|
|
|
|
func ParseIdTypeWithName(m map[string]any, b BaseApChain, name string) (*FullIdType, error) {
|
|
rawData1, ok := m[name]
|
|
if !ok {
|
|
return nil, NoRequiredFieldError{name}
|
|
}
|
|
data1, ok := rawData1.([]map[string]any)
|
|
if !ok {
|
|
return nil, BadFieldValueError[[]map[string]any]{name, rawData1, []map[string]any{{}}}
|
|
}
|
|
if len(data1) != 1 {
|
|
return nil, BadFieldArrayLengthError{name, 1, len(data1)}
|
|
}
|
|
rawData2, ok := data1[0][KEY_ID]
|
|
if !ok {
|
|
return nil, NoRequiredSubFieldError{name, KEY_ID}
|
|
}
|
|
data2, ok := rawData1.(string)
|
|
if !ok {
|
|
return nil, BadFieldValueError[string]{name, rawData2, ""}
|
|
}
|
|
delete(m, name)
|
|
return &FullIdType{
|
|
Next: b,
|
|
Id: data2,
|
|
}, nil
|
|
}
|
|
|
|
type FullValueType[T any] struct {
|
|
Next BaseApChain
|
|
Value ValueValue[T]
|
|
}
|
|
|
|
func (v *FullValueType[T]) GetSelfOrBase() (BaseApChain, bool) {
|
|
return v.Next, true
|
|
}
|
|
|
|
func (v *FullValueType[T]) MarshalToMapWithName(name string) map[string]any {
|
|
m := v.Next.MarshalToMap()
|
|
if m == nil {
|
|
m = map[string]any{}
|
|
}
|
|
m[name] = []map[string]any{v.Value.Marshal()}
|
|
return m
|
|
}
|
|
|
|
func ParseValueTypeWithName[T any](
|
|
m map[string]any,
|
|
b BaseApChain,
|
|
name string,
|
|
) (*FullValueType[T], error) {
|
|
rawData1, ok := m[name]
|
|
if !ok {
|
|
return nil, NoRequiredFieldError{name}
|
|
}
|
|
data1, ok := rawData1.([]map[string]any)
|
|
if !ok {
|
|
return nil, BadFieldValueError[[]map[string]any]{
|
|
name,
|
|
rawData1,
|
|
data1,
|
|
}
|
|
}
|
|
if len(data1) != 1 {
|
|
return nil, BadFieldArrayLengthError{name, 1, len(data1)}
|
|
}
|
|
tmp, err := ParseValueValue[T](data1[0])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
delete(m, name)
|
|
return &FullValueType[T]{
|
|
Next: b,
|
|
Value: *tmp,
|
|
}, nil
|
|
}
|