mirror of
https://github.com/TomWright/dasel.git
synced 2022-05-22 02:32:45 +03:00
63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
package dasel
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
"sort"
|
|
)
|
|
|
|
// SortedComparisonCondition lets you check for an exact match.
|
|
type SortedComparisonCondition struct {
|
|
// Key is the key of the value to check against.
|
|
Key string
|
|
// Value is the value we are looking for.
|
|
Value string
|
|
// Equal is true if the values can match.
|
|
Equal bool
|
|
// After is true if the input value should be sorted after the Value.
|
|
After bool
|
|
}
|
|
|
|
// Check checks to see if other contains the required key value pair.
|
|
func (c SortedComparisonCondition) Check(other reflect.Value) (bool, error) {
|
|
if !other.IsValid() {
|
|
return false, &UnhandledCheckType{Value: nil}
|
|
}
|
|
|
|
value := unwrapValue(other)
|
|
|
|
if c.Key == "value" || c.Key == "." {
|
|
return fmt.Sprint(value.Interface()) == c.Value, nil
|
|
}
|
|
|
|
subRootNode := New(value.Interface())
|
|
foundNode, err := subRootNode.Query(c.Key)
|
|
if err != nil {
|
|
var valueNotFound = &ValueNotFound{}
|
|
if errors.As(err, &valueNotFound) {
|
|
return false, nil
|
|
}
|
|
|
|
return false, fmt.Errorf("subquery failed: %w", err)
|
|
}
|
|
|
|
foundValueStr := fmt.Sprint(foundNode.InterfaceValue())
|
|
|
|
// Check if the values are equal
|
|
if foundValueStr == c.Value {
|
|
return c.Equal, nil
|
|
}
|
|
|
|
sortedVals := []string{foundValueStr, c.Value}
|
|
sort.Strings(sortedVals)
|
|
|
|
if !c.After && sortedVals[1] == c.Value {
|
|
return true, nil
|
|
} else if c.After && sortedVals[0] == c.Value {
|
|
return true, nil
|
|
}
|
|
|
|
return false, nil
|
|
}
|