Documentation ¶
Index ¶
- func EachType(col Collector, pkg *loader.Package, cb TypeCallback) error
- type Argument
- type ArgumentType
- type Collector
- type Definition
- type DefinitionHelp
- type DetailedHelp
- type FieldInfo
- type MarkerValues
- type RawArguments
- type Registry
- type ScannerError
- type TargetType
- type TypeCallback
- type TypeInfo
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func EachType ¶
func EachType(col Collector, pkg *loader.Package, cb TypeCallback) error
EachType collects all markers, then calls the given callback for each type declaration in a package. Each individual spec is considered separate, so
type ( Foo string Bar int Baz struct{} )
yields three calls to the callback.
Types ¶
type Argument ¶
type Argument struct { // Type is the type of this argument For non-scalar types (map and slice), // further information is specified in ItemType. Type ArgumentType // Optional indicates if this argument is optional. Optional bool // Pointer indicates if this argument was a pointer (this is really only // needed for deserialization, and should alway imply optional) Pointer bool // ItemType is the type of the slice item for slices, and the value type // for maps. ItemType *Argument }
Argument is the type of a marker argument.
func ArgumentFromType ¶
ArgumentFromType constructs an Argument by examining the given raw reflect.Type. It can construct arguments from the Go types corresponding to any of the types listed in ArgumentType.
type ArgumentType ¶
type ArgumentType int
ArgumentType is the kind of a marker argument type. It's roughly analogous to a subset of reflect.Kind, with an extra "AnyType" to represent the empty interface.
const ( // Invalid represents a type that can't be parsed, and should never be used. InvalidType ArgumentType = iota // IntType is an int IntType // NumberType is a float64 NumberType // StringType is a string StringType // BoolType is a bool BoolType // AnyType is the empty interface, and matches the rest of the content AnyType // SliceType is any slice constructed of the ArgumentTypes SliceType // MapType is any map constructed of string keys, and ArgumentType values. // Keys are strings, and it's common to see AnyType (non-uniform) values. MapType // RawType represents content that gets passed directly to the marker // without any parsing. It should *only* be used with anonymous markers. RawType )
type Collector ¶
type Collector interface { MarkersInPackage(pkg *loader.Package) (map[ast.Node]MarkerValues, error) Print() }
Collector collects and parses marker comments defined in the registry from package source code.
func NewCollector ¶
type Definition ¶
type Definition struct { // Output is the deserialized Go type of the marker. Output reflect.Type // Name is the marker's name. Name string // Target indicates which kind of node this marker can be associated with. Target TargetType // Fields lists out the types of each field that this marker has, by // argument name as used in the marker (if the output type isn't a struct, // it'll have a single, blank field name). This only lists exported fields, // (as per reflection rules). Fields map[string]Argument // FieldNames maps argument names (as used in the marker) to struct field name // in the output type. FieldNames map[string]string // Strict indicates that this definition should error out when parsing if // not all non-optional fields were seen. Strict bool }
Definition is a parsed definition of a marker.
func MakeAnyTypeDefinition ¶
func MakeAnyTypeDefinition(name string, target TargetType, output interface{}) (*Definition, error)
MakeAnyTypeDefinition constructs a definition for an output struct with a field named `Value` of type `interface{}`. The argument to the marker will be parsed as AnyType and assigned to the field named `Value`.
func MakeDefinition ¶
func MakeDefinition(name string, target TargetType, output interface{}) (*Definition, error)
MakeDefinition constructs a definition from a name, type, and the output type. All such definitions are strict by default. If a struct is passed as the output type, its public fields will automatically be populated into Fields (and similar fields in Definition). Other values will have a single, empty-string-named Fields entry.
func Must ¶
func Must(def *Definition, err error) *Definition
Must panics on errors creating definitions.
func (*Definition) AnonymousField ¶
func (r *Definition) AnonymousField() bool
AnonymousField indicates that the definition has one field, (actually the original object), and thus the field doesn't get named as part of the name.
func (*Definition) Empty ¶
func (r *Definition) Empty() bool
Empty indicates that this definition has no fields.
func (*Definition) Parse ¶
func (r *Definition) Parse(rawMarker string) (interface{}, error)
Parse uses the type information in this Definition to parse the given raw marker in the form `+a:b:c=arg,d=arg` into an output object of the type specified in the definition.
type DefinitionHelp ¶
type DefinitionHelp struct { // DetailedHelp contains the overall help for the marker. DetailedHelp // Category describes what kind of marker this is. Category string // DeprecatedInFavorOf marks the marker as deprecated. // If non-nil & empty, it's assumed to just mean deprecated permanently. // If non-empty, it's assumed to be a marker name. DeprecatedInFavorOf *string // FieldHelp defines the per-field help for this marker, *in terms of the // go struct field names. Use the FieldsHelp method to map this to // marker argument names. FieldHelp map[string]DetailedHelp }
DefinitionHelp contains overall help for a marker Definition, as well as per-field help.
func SimpleHelp ¶
func SimpleHelp(category, summary string) *DefinitionHelp
SimpleHelp returns help that just has marker-level summary information (e.g. for use with empty or primitive-typed markers, where Godoc-based generation isn't possible).
type DetailedHelp ¶
DetailedHelp contains brief help, as well as more details. For the "full" help, join the two together.
type FieldInfo ¶
type FieldInfo struct { // Name is the name of the field (or "" for embedded fields) Name string // Doc is the Godoc of the field, pre-processed to remove markers and joine // single newlines together. Doc string // Tag struct tag associated with this field (or "" if non existed). Tag reflect.StructTag // Markers are all registered markers associated with this field. Markers MarkerValues // RawField is the raw, underlying field AST object that this field represents. RawField *ast.Field }
FieldInfo contains marker values and commonly used information for a struct field.
type MarkerValues ¶
MarkerValues are all the values for some set of markers.
func PackageMarkers ¶
func PackageMarkers(col Collector, pkg *loader.Package) (MarkerValues, error)
PackageMarkers collects all the package-level marker values for the given package.
func (MarkerValues) Get ¶
func (v MarkerValues) Get(name string) any
Get fetches the first value that for the given marker, returning nil if no values are available.
type RawArguments ¶
type RawArguments []byte
RawArguments is a special type that can be used for a marker to receive *all* raw, underparsed argument data for a marker. You probably want to use `interface{}` to match any type instead. Use *only* for legacy markers that don't follow Definition's normal parsing logic. It should *not* be used as a field in a marker struct.
type Registry ¶
type Registry interface { Register(def *Definition) error Lookup(name string, target TargetType) *Definition AddHelp(def *Definition, help *DefinitionHelp) Print() }
Registry keeps track of registered definitions, and allows for easy lookup.
func NewRegistry ¶
type ScannerError ¶
func (*ScannerError) Error ¶
func (e *ScannerError) Error() string
type TargetType ¶
type TargetType int
TargetType describes which kind of node a given marker is associated with.
const ( // DescribesPackage indicates that a marker is associated with a package. DescribesPackage TargetType = iota // DescribesType indicates that a marker is associated with a type declaration. DescribesType // DescribesField indicates that a marker is associated with a struct field. DescribesField )
type TypeCallback ¶
type TypeCallback func(info *TypeInfo)
TypeCallback is a callback called for each type declaration in a package.
type TypeInfo ¶
type TypeInfo struct { // Name is the name of the type. Name string // Doc is the Godoc of the type, pre-processed to remove markers and joine // single newlines together. Doc string // Markers are all registered markers associated with the type. Markers MarkerValues // Fields are all the fields associated with the type, if it's a struct. // (if not, Fields will be nil). Fields []FieldInfo // RawDecl contains the raw GenDecl that the type was declared as part of. RawDecl *ast.GenDecl // RawSpec contains the raw Spec that declared this type. RawSpec *ast.TypeSpec // RawFile contains the file in which this type was declared. RawFile *ast.File }
TypeInfo contains marker values and commonly used information for a type declaration.