parser

package
v0.0.0-...-c8bdcb0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 17, 2024 License: MPL-2.0 Imports: 10 Imported by: 0

Documentation

Index

Constants

View Source
const (
	ResourceSuffix   = ""
	ResourceIdSuffix = "Id"
)
View Source
const RefPrefix = "#/components/schemas/"

Variables

This section is empty.

Functions

func ModelOrConstant

func ModelOrConstant(schemaName string, schemaRef *openapi3.SchemaRef, common bool) (*Model, *Constant, error)

func ModelsAndConstants

func ModelsAndConstants(schemas openapi3.Schemas) (Models, Constants, error)

func TrimRefPrefix

func TrimRefPrefix(ref string) string

Types

type Constant

type Constant struct {
	// The name of this constant from the spec (not normalized)
	Name string

	// Whether this constant is a common type
	Common bool

	// The accepted values for this constant
	Enum []string

	// The data type for this constant (currently only supports strings)
	Type *DataType
}

type Constants

type Constants map[string]*Constant

func (Constants) Found

func (c Constants) Found(schemaName string) bool

Found returns true when the provided schemaName was found in the Constants map

type DataType

type DataType uint8
const (
	DataTypeUnknown DataType = iota // zero value is used for comparisons, don't remove
	DataTypeArray
	DataTypeBase64
	DataTypeBinary
	DataTypeBool
	DataTypeCsv
	DataTypeDate
	DataTypeDateTime
	DataTypeDuration
	DataTypeFloat32
	DataTypeFloat64
	DataTypeInteger16
	DataTypeInteger32
	DataTypeInteger64
	DataTypeInteger8
	DataTypeIntegerUnsigned16
	DataTypeIntegerUnsigned32
	DataTypeIntegerUnsigned64
	DataTypeIntegerUnsigned8
	DataTypeReference
	DataTypeString
	DataTypeTime
	DataTypeUuid
)

func FieldType

func FieldType(schemaType, schemaFormat string, hasReference bool) *DataType

FieldType parses the schemaType and schemaFormat from the OpenAPI spec for a given field, and returns the appropriate DataType

func (DataType) DataApiSdkObjectDefinitionType

func (ft DataType) DataApiSdkObjectDefinitionType() sdkModels.SDKObjectDefinitionType

func (DataType) DataApiSdkOperationOptionObjectDefinitionType

func (ft DataType) DataApiSdkOperationOptionObjectDefinitionType() sdkModels.SDKOperationOptionObjectDefinitionType
type Header struct {
	Name string
	Type *DataType
}

func (Header) DataApiSdkObjectDefinition

func (h Header) DataApiSdkObjectDefinition() (*sdkModels.SDKOperationOptionObjectDefinition, error)

type Model

type Model struct {
	// The type name of this model from the spec (not normalized)
	Name string

	// Fields that comprise this model
	Fields map[string]*ModelField

	// Whether this model is a common type
	Common bool

	// Whether this model has known child models
	Parent bool

	// For parent models, the field name containing the discriminated type value
	TypeField *string

	// For child models, the type value that specifies this model
	TypeValue *string

	// For child models, the name of the parent model
	ParentModel *string
}

func (*Model) AppendDefaultFields

func (m *Model) AppendDefaultFields()

func (*Model) DataApiSdkModel

func (m *Model) DataApiSdkModel(models Models, constants Constants) (*sdkModels.SDKModel, error)

DataApiSdkModel converts the internal ModelField representation to a Data API SDKModel, so it can be persisted to the Data API Definitions. It's necessary to provide Models and Constants so that references (both fields and model ancestry) can be resolved.

type ModelField

type ModelField struct {
	// The name of this field
	Name string

	// The internal type for this field
	Type *DataType

	// The internal type for items, when this field type is DataTypeArray
	ItemType *DataType

	// Optional description which can be added to the generated SDK model as a comment
	Description string

	// The default value for this field
	Default any

	// Whether the field is required
	Required bool

	// Read-only fields should be omitted during marshalling in the generated SDK
	ReadOnly bool

	// Whether the field value can be a JSON null
	Nullable bool

	// Whether this field contains the discriminated type for a child model
	DiscriminatedValue bool

	// The name of a referenced model or constant, noting that this should be the full type name from the spec prior to normalizing
	ReferenceName *string

	// This is parsed from the spec but otherwise currently unused
	WriteOnly       bool
	AllowEmptyValue bool
}

func (ModelField) DataApiSdkObjectDefinition

func (f ModelField) DataApiSdkObjectDefinition(models Models, constants Constants) (*sdkModels.SDKObjectDefinition, error)

DataApiSdkObjectDefinition converts the internal ModelField representation to a Data API SDKObjectDefinition, so it can be persisted to the Data API Definitions. It's necessary to provide Models and Constants so that references can be resolved.

type Models

type Models map[string]*Model

func (Models) Found

func (m Models) Found(schemaName string) bool

Found returns true when the provided schemaName was found in the Models map

type Operation

type Operation struct {
	// The full name of this operation, which should be unique across resources (at least in the same category) so
	// prevent clobbering when resources/operations are grouped into an SDK package
	Name string

	// Optional description which can be added to the generated SDK model as a comment
	Description string

	// The type of this operation, initially determined from the HTTP method
	Type OperationType

	// The HTTP method for this operation
	Method string

	// The resource ID that comprises the first part of the URI for this operation
	ResourceId *ResourceId

	// The remainder of the URI after the resource ID
	UriSuffix *string

	// When the content type is JSON or XML, and this is a List operation, the name of the field
	// that specifies a URL to retrieve the next page of results
	PaginationField *string

	// The content-type of the request body
	RequestContentType *string

	// The name of the model that describes the request body, can reference either a common model or describe the ad-hoc request model
	RequestModelName *string

	// The optional ad-hoc request model, if present
	RequestModel *Model

	// Any user-specified HTTP headers supported for the request
	RequestHeaders *[]Header

	// Any user-specified query string parameters support for the request
	RequestParams *[]Param

	// The internal data type for the request, used when the content type is JSON or XML,
	// and the request is not described by a model
	RequestType *DataType

	// The HTTP status codes associated with this expected response
	ResponseStatusCodes []int

	// The expected content type for this resource
	ResponseContentType *string

	// Specifies a referenced model or constant for the response, noting that this
	// should be the full type name from the spec prior to normalizing
	ResponseReferenceName *string

	// The internal data type for the response, used when the content type is JSON or XML,
	// and the response is not described by a model
	ResponseType *DataType

	// Model and Constant are used internally for ad-hoc response models
	ResponseModel    *Model
	ResponseConstant *Constant

	// OpenAPI3 tags for this operation, used to reconcile operations to services
	Tags []string
}

type OperationType

type OperationType uint8
const (
	OperationTypeUnknown OperationType = iota
	OperationTypeList
	OperationTypeRead
	OperationTypeCreate
	OperationTypeCreateUpdate
	OperationTypeUpdate
	OperationTypeDelete
)

func NewOperationType

func NewOperationType(method string) OperationType

type Param

type Param struct {
	Name     string
	Type     *DataType
	ItemType *DataType
}

func (Param) DataApiSdkObjectDefinition

func (p Param) DataApiSdkObjectDefinition() (*sdkModels.SDKOperationOptionObjectDefinition, error)

type Resource

type Resource struct {
	// The name of this resource
	Name string

	// The category for this resource, used to group resources together in the same SDK package
	Category string

	// The API version for this resource
	Version string

	// The name of the service associated with this resource
	Service string

	// All known paths for this resource, used for category matching between different resources
	Paths []ResourceId

	// Supported operations for this resource
	Operations []Operation
}

type ResourceId

type ResourceId struct {
	Name     string
	Service  string
	Segments []ResourceIdSegment
}

ResourceId represents a unique path in Microsoft Graph that represents a resource. Resource IDs comprise a non-zero number of segments, the last of which must always be of type SegmentUserValue (i.e. specified by the user). Whilst paths in Microsoft Graph can comprise different types of object identifiers, we currently only support simple SegmentUserValue segments where the entire slug is provided. For example, these two paths are functionally equivalent:

/applications/{id}/federatedIdentityCredentials/{federatedIdentityCredentialId}
/applications(appId='{appId}')/federatedIdentityCredentials/{federatedIdentityCredentialName}

however we only support the first style, where the user-provided portion of each SegmentUserValue comprises the entire slug. Complex segments such as `(appId='{appId}')` are not supported at this time.

func NewResourceId

func NewResourceId(path string, tags []string) (id ResourceId)

NewResourceId analyses the provided path and returns a parsed ResourceId with typed segments. Any tags provided are used to determine the type of certain matching segments, as it is otherwise not possible to distinguish between a SegmentAction or SegmentCast because they have the same format.

func (ResourceId) DataApiSdkResourceId

func (r ResourceId) DataApiSdkResourceId() (*sdkModels.ResourceID, error)

DataApiSdkResourceId converts the internal ResourceId representation to a Data API SDK ResourceID, so it can be persisted to the Data API Definitions.

func (ResourceId) FullyQualifiedResourceName

func (r ResourceId) FullyQualifiedResourceName(suffixQualification *string) (*string, bool)

FullyQualifiedResourceName returns a human-readable name for the ResourceId, using all segments, each segment singularized except when the following segment is an OData reference or plural function, or the first known verb is encountered. e.g. if r represents `/applications/{applicationId}/synchronization/jobs/{synchronizationJobId}/schema`, the returned name will be `ApplicationSynchronizationJob` See unit test cases for more examples.

func (ResourceId) HasUserValue

func (r ResourceId) HasUserValue() bool

HasUserValue returns true if the ResourceId contains one or more SegmentUserValue segments.

func (ResourceId) ID

func (r ResourceId) ID() string

func (ResourceId) IsMatchOrAncestor

func (r ResourceId) IsMatchOrAncestor(r2 ResourceId) (ResourceId, bool)

IsMatchOrAncestor compares the provided ResourceId (r2) against the current ResourceId and returns true if the two resource IDs match, or if this ResourceId is an ancestor of the provided ResourceId.

func (ResourceId) LastLabel

func (r ResourceId) LastLabel() *ResourceIdSegment

LastLabel returns the last label segment from the ResourceId

func (ResourceId) LastLabelBeforeSegment

func (r ResourceId) LastLabelBeforeSegment(i int) *ResourceIdSegment

LastLabelBeforeSegment returns the last label segment from the ResourceId that precedes the provided segment index

func (ResourceId) LastSegmentOfTypeBeforeSegment

func (r ResourceId) LastSegmentOfTypeBeforeSegment(types []ResourceIdSegmentType, i int) *ResourceIdSegment

LastSegmentOfTypeBeforeSegment returns the last segment of the specified type from the ResourceId that precedes the provided segment index

func (ResourceId) ResourceIdName

func (r ResourceId) ResourceIdName() (*string, bool)

ResourceIdName returns a name for the ResourceId. This calls FullyQualifiedResourceName with a common suffix to be appended to all words preceding a user value. For example:

/groups/{groupId}/photos/{photoId} becomes GroupIdPhotoId
/users/{userId}/messages/{messageId}/attachments/{attachmentId} becomes UserIdMessageIdAttachmentId

func (ResourceId) TruncateToLastSegmentOfTypeBeforeSegment

func (r ResourceId) TruncateToLastSegmentOfTypeBeforeSegment(types []ResourceIdSegmentType, i int) *ResourceId

TruncateToLastSegmentOfTypeBeforeSegment returns a new ResourceId, truncated to the last segment of the specified type from the ResourceId that precedes the provided segment index

type ResourceIdMatch

type ResourceIdMatch struct {
	Id        *ResourceId
	Remainder *ResourceId
}

type ResourceIdSegment

type ResourceIdSegment struct {
	Type  ResourceIdSegmentType
	Value string
	// contains filtered or unexported fields
}

type ResourceIdSegmentType

type ResourceIdSegmentType string
const (
	SegmentLabel          ResourceIdSegmentType = "Label"
	SegmentUserValue      ResourceIdSegmentType = "UserValue"
	SegmentODataReference ResourceIdSegmentType = "ODataReference"
	SegmentAction         ResourceIdSegmentType = "Action"
	SegmentCast           ResourceIdSegmentType = "Cast"
	SegmentFunction       ResourceIdSegmentType = "Function"
)

type ResourceIds

type ResourceIds map[string]*ResourceId

func ResourceIDs

func ResourceIDs(paths openapi3.Paths, serviceName *string) (resourceIds ResourceIds, err error)

ResourceIDs parses the provided openapi3.Paths and returns a map of ResourceId containing all possible detected resource IDs

func (ResourceIds) MatchIdOrAncestor

func (ri ResourceIds) MatchIdOrAncestor(resourceId ResourceId) (*ResourceIdMatch, bool)

MatchIdOrAncestor returns a ResourceIdMatch containing a matching/ancestor ResourceId and/or a remainder value, or nil if no match/ancestor was found. A match is a ResourceId that represents the same path, and an ancestor is any ResourceId that represents a shorter matching path. Where multiple ancestors are found, the most granular (i.e. the longest) ancestor is returned.

Example 1: If resourceId represents `/users/{userId}` The returned ResourceIdMatch is likely to represent `/users/{userId}` (a match) with no remainder.

Example 2: If resourceId represents `/applications/{applicationId}/owners` The returned ResourceIdMatch is likely to represent `/applications/{applicationId}` with a remainder of `/owners`

type Resources

type Resources map[string]*Resource

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL