Documentation ¶
Overview ¶
Package schemaspec provides types designed to capture atlas schema elements, and create type-safe extensions to the configuration language. This package is designed to provide an intermediate representation between a serialized configuration language representation (Atlas HCL, JSON, YAML, etc.) and concrete representations that are created and handled by a specific driver.
The basic type that is handled in this package is schemaspec.Resource which is a generic container for resources described in Atlas configurations. A resource has a set of "Attr" instances associated with it, as well a a list of children schemaspec.Resource instances that can be associated with it.
Users of Atlas applications are expected to interface with this package via a configuration language package. For example, via the `schemahcl` package:
schemahcl.Unmarshal([]byte(` table "users" { column "id" { type = "int" } } `), &someStruct{})
Applications working with the Atlas DDL are expected to extend the Atlas language by defining their own type structs that objects can be handled in a type-safe way. Resource objects provide the `As` method to read a resource into an extension struct, as well as a `Scan` method to read an extension struct back into a Resource.
The mapping between the extension struct fields and a Resource is done by placing tags on the extension struct field using the `spec` key in the tag. To specify that a field should be mapped to the corresponding Resource's `Name` specify ",name" to the tag value. For example,
type Point struct { ID string `spec:",name"` X int `spec:"x" Y int `spec:"y" }
Would be able to capture a Resource defined in Atlas HCL as:
point "origin" { x = 100 y = 200 }
Extension structs may implement the Remainer interface if they wish to store any attributes and children that are not matched by their tagged fields. As a convenience the package exports a DefaultExtension type that can be embedded to support this behavior.
Index ¶
- func BoolVal(v Value) (bool, error)
- func Register(name string, ext interface{})
- func StrVal(v Value) (string, error)
- type Attr
- type DefaultExtension
- type ListValue
- type LiteralValue
- type Marshaler
- type MarshalerFunc
- type RawExpr
- type Ref
- type Remainer
- type Resource
- type Type
- type TypeAttr
- type TypeSpec
- type Unmarshaler
- type UnmarshalerFunc
- type Value
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func BoolVal ¶
BoolVal returns the bool representation of v. If v is not a *LiteralValue it returns an error. If the raw string representation of v cannot be read as a bool, an error is returned as well.
Types ¶
type Attr ¶
Attr is an attribute of a Resource.
func (*Attr) Bool ¶
Bool returns a boolean from the Value of the Attr. If The value is not a LiteralValue or the value cannot be converted to a boolean an error is returned.
func (*Attr) Bools ¶
Bools returns a slice of bools from the Value of the Attr. If The value is not a ListValue or its values cannot be converted to bools an error is returned.
func (*Attr) Int ¶
Int returns an integer from the Value of the Attr. If The value is not a LiteralValue or the value cannot be converted to an integer an error is returned.
func (*Attr) Ref ¶
Ref returns the string representation of the Attr. If the value is not a Ref or the value an error is returned.
type DefaultExtension ¶
type DefaultExtension struct {
Extra Resource
}
DefaultExtension can be embedded in structs that need basic default behavior. For instance, DefaultExtension implements Remainer, and has a private *Resource field that can store additional attributes and children that do not match the structs fields.
func (*DefaultExtension) Attr ¶
func (d *DefaultExtension) Attr(name string) (*Attr, bool)
Attr returns the Attr by the provided name and reports whether it was found.
func (*DefaultExtension) Remain ¶
func (d *DefaultExtension) Remain() *Resource
Remain implements the Remainer interface.
type ListValue ¶
type ListValue struct {
V []Value
}
ListValue implements Value and represents a list of Values.
type LiteralValue ¶
type LiteralValue struct {
V string
}
LiteralValue implements Value and represents a literal value (string, number, etc.)
type Marshaler ¶
Marshaler is the interface implemented by types that can marshal objects into a valid Atlas DDL representation.
type MarshalerFunc ¶
MarshalerFunc is the function type that is implemented by the MarshalSpec method of the Marshaler interface.
func (MarshalerFunc) MarshalSpec ¶
func (f MarshalerFunc) MarshalSpec(v interface{}) ([]byte, error)
MarshalSpec implements Marshaler.
type RawExpr ¶ added in v0.2.0
type RawExpr struct {
X string
}
RawExpr implements Value and represents any raw expression.
type Ref ¶
type Ref struct {
V string
}
Ref implements Value and represents a reference to another Resource. The path to a Resource under the root Resource is expressed as "$<type>.<name>..." recursively. For example, a resource of type "table" that is named "users" and is a direct child of the root Resource's address shall be "$table.users". A child resource of that table of type "column" and named "id", shall be referenced as "$table.users.$column.id", and so on.
type Remainer ¶
type Remainer interface { // Remain returns a resource representing any extra children and attributes // that are related to the struct but were not mapped to any of its fields. Remain() *Resource }
Remainer is the interface that is implemented by types that can store additional attributes and children resources.
type Resource ¶
Resource is a generic container for resources described in configurations.
func (*Resource) As ¶
As reads the attributes and children resources of the resource into the target struct.
func (*Resource) Attr ¶
Attr returns the Attr by the provided name and reports whether it was found.
type TypeAttr ¶ added in v0.2.0
type TypeAttr struct { // Name should be a snake_case of related the schema.Type struct field. Name string Kind reflect.Kind Required bool }
TypeAttr describes an attribute of a TypeSpec, for example `varchar` fields can have a `size` attribute.
type TypeSpec ¶ added in v0.2.0
type TypeSpec struct { // Name is the identifier for the type in an Atlas DDL document. Name string // T is the database identifier for the type. T string Attributes []*TypeAttr // RType is the reflect.Type of the schema.Type used to describe the TypeSpec. // This field is optional and used to determine the TypeSpec in cases where the // schema.Type does not have a `T` field. RType reflect.Type }
TypeSpec represents a specification for defining a Type.
type Unmarshaler ¶
Unmarshaler is the interface implemented by types that can unmarshal an Atlas DDL representation into an object.
type UnmarshalerFunc ¶
UnmarshalerFunc is the function type that is implemented by the UnmarshalSpec method of the Unmarshaler interface.
func (UnmarshalerFunc) UnmarshalSpec ¶
func (f UnmarshalerFunc) UnmarshalSpec(data []byte, v interface{}) error
UnmarshalSpec implements Unmarshaler.