package configschema

// NoneRequired returns a deep copy of the receiver with any required
// attributes translated to optional.
func (b *Block) NoneRequired() *Block {
	ret := &Block{}

	if b.Attributes != nil {
		ret.Attributes = make(map[string]*Attribute, len(b.Attributes))
	}
	for name, attrS := range b.Attributes {
		ret.Attributes[name] = attrS.forceOptional()
	}

	if b.BlockTypes != nil {
		ret.BlockTypes = make(map[string]*NestedBlock, len(b.BlockTypes))
	}
	for name, blockS := range b.BlockTypes {
		ret.BlockTypes[name] = blockS.noneRequired()
	}

	return ret
}

func (b *NestedBlock) noneRequired() *NestedBlock {
	ret := *b
	ret.Block = *(ret.Block.NoneRequired())
	ret.MinItems = 0
	ret.MaxItems = 0
	return &ret
}

func (a *Attribute) forceOptional() *Attribute {
	ret := *a
	ret.Optional = true
	ret.Required = false
	return &ret
}
