goap/commonTypes.go
2025-04-09 15:44:23 +02:00

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
}