blob: bb0f3d8b48cadc7aed060972ae2199c0d1796f21 [file] [log] [blame]
package configschema
type FilterT[T any] func(string, T) bool
var (
FilterReadOnlyAttribute = func(name string, attribute *Attribute) bool {
return attribute.Computed && !attribute.Optional
}
FilterHelperSchemaIdAttribute = func(name string, attribute *Attribute) bool {
if name == "id" && attribute.Computed && attribute.Optional {
return true
}
return false
}
FilterDeprecatedAttribute = func(name string, attribute *Attribute) bool {
return attribute.Deprecated
}
FilterDeprecatedBlock = func(name string, block *NestedBlock) bool {
return block.Deprecated
}
)
func FilterOr[T any](filters ...FilterT[T]) FilterT[T] {
return func(name string, value T) bool {
for _, f := range filters {
if f(name, value) {
return true
}
}
return false
}
}
func (b *Block) Filter(filterAttribute FilterT[*Attribute], filterBlock FilterT[*NestedBlock]) *Block {
ret := &Block{
Description: b.Description,
DescriptionKind: b.DescriptionKind,
Deprecated: b.Deprecated,
}
if b.Attributes != nil {
ret.Attributes = make(map[string]*Attribute, len(b.Attributes))
}
for name, attrS := range b.Attributes {
if filterAttribute == nil || !filterAttribute(name, attrS) {
ret.Attributes[name] = attrS
}
if attrS.NestedType != nil {
ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, filterAttribute)
}
}
if b.BlockTypes != nil {
ret.BlockTypes = make(map[string]*NestedBlock, len(b.BlockTypes))
}
for name, blockS := range b.BlockTypes {
if filterBlock == nil || !filterBlock(name, blockS) {
block := blockS.Filter(filterAttribute, filterBlock)
ret.BlockTypes[name] = &NestedBlock{
Block: *block,
Nesting: blockS.Nesting,
MinItems: blockS.MinItems,
MaxItems: blockS.MaxItems,
}
}
}
return ret
}
func filterNestedType(obj *Object, filterAttribute FilterT[*Attribute]) *Object {
if obj == nil {
return nil
}
ret := &Object{
Attributes: map[string]*Attribute{},
Nesting: obj.Nesting,
}
for name, attrS := range obj.Attributes {
if filterAttribute == nil || !filterAttribute(name, attrS) {
ret.Attributes[name] = attrS
if attrS.NestedType != nil {
ret.Attributes[name].NestedType = filterNestedType(attrS.NestedType, filterAttribute)
}
}
}
return ret
}