package attributes

type AttributeType string
const (
	AttributeTypeNoReturn AttributeType = "noreturn"
	AttributeTypeInline   AttributeType = "inline"
	AttributeTypeNoInline AttributeType = "noinline"
	AttributeTypeForeign  AttributeType = "foreign"
)

type Attribute interface {
	GetType() AttributeType // marker method
}

type FunctionAttributeNoReturn struct{}
func (a FunctionAttributeNoReturn) GetType() AttributeType { return AttributeTypeNoReturn }
type FunctionAttributeInline struct{}
func (a FunctionAttributeInline) GetType() AttributeType { return AttributeTypeInline }
type FunctionAttributeNoInline struct{}
func (a FunctionAttributeNoInline) GetType() AttributeType { return AttributeTypeNoInline }
type FunctionAttributeForeign struct {
	From string
}
func (a FunctionAttributeForeign) GetType() AttributeType { return AttributeTypeForeign }

type Attributes []Attribute

func (a Attributes) Get(attrType AttributeType) Attribute {
	for _, attr := range a {
		if attr.GetType() == attrType {
			return attr
		}
	}
	return nil
}