blob: 1b90153453eff2047226f497db9345e5e3ce23ff [file] [log] [blame]
/* STANDARD_RIFT_IO_COPYRIGHT */
/**
* @file rw-pb-ext.yang
* @author Tim Mortsolf, Anil Gunturu, Tom Seidenberg
* @date 2013/03/21
* @brief RiftWare yang to protobuf conversion extensions
*/
module rw-pb-ext
{
namespace "http://riftio.com/ns/riftware-1.0/rw-pb-ext";
prefix "rwpb";
revision 2014-03-28 {
description
"Initial revision.";
reference
"RIFT yang extensions for converting yang files to Google
Protocol Buffers (protobuf) using rift protoc-c extensions.";
}
extension msg-new {
argument "typename";
description
"Generate an equivalent, top-level, protobuf message for this
container, list, rpc input, rpc output, or notification. The
argument is the name of the protobuf message type. Allowed
values are valid C identifiers.
The protobuf definition will only be generated when processing
the same module that defines the yang object - a duplicate will
not be generated when importing reusing a yang object via uses,
or when importing the module.";
}
extension msg-name {
argument "typename";
description
"Change the name of an embedded protobuf message type for this
container or list. Allowed values are valid C identifiers.
In lieu of this extension, embedded protobuf message typenames
are based on the fieldname, and further mangled by removing
underscores and CamelCased at underscore boundaries. This
extension allows the automatic mangling procedure to be
overridden.
This extension is incompatible with msg-new, which already
defines the typename for top-level messages. Use this extension
solely for embedded messages.";
}
extension msg-flat {
argument "selection";
description
"Set the protobuf message rw_msgopts flat option on a container
or list statement. Allowed values are 'true', 'false', and
'auto'. The default is 'false' for top-level messages, and
'auto' for embedded messages. If 'auto' is specified, the
behavior is the same as the enclosing container or list.
Unless overridden, this extension effectively applies to all
enclosed descendent container and list statements. Flatness will
be required by the protobuf compilation step.";
}
extension msg-tag-base {
argument "value";
description
"Specify a base tag value for a container, list, grouping, or
uses statement. Field tags may be specified relative to this
base. Allowed values are positive
decimal integers.";
// ATTN: would really like to specify field-relative in uses!
}
/*
extension msg-tag-reserve {
argument "value";
description
"Reserve space in the tag numbering for future expansion of the
enclosing grouping, container, or choice. Must be a positive
decimal integer. Choose carefully, as you cannot increase the
value at a later time.";
}
*/
extension msg-proto-max-size {
argument "value";
description
"Specify the maximum size of this message in the C structure or
so in bytes. Allowed values are positive decimal integers.";
}
extension msg-typedef {
argument "typename";
description
"Create a prototbuf-c message typedef for the original, base
definition of the container, list, grouping, rpc input, rpc
output, or notification. Allowed values are valid C identifiers.
typename will be appended to the mangeled protobuf package name
and an underscore, to ensure name uniqueness across the global
schema.
The typedef will only be generated when processing
the same module that defines the yang object - a duplicate will
not be generated when importing reusing a yang object via uses,
or when importing the module.";
}
extension field-name {
argument "fieldname";
description
"Change the name of the element to fieldname, when converting the
object to protobuf. Allowed values are valid C identifiers.
In lieu of this extension, element names will be used as-is, if
possible, or mangled to fit in the C identifier character space
(invalid C identifier characters will be replaced with
underscore). This extension allows the automatic mangling
procedure to be overridden.";
}
extension field-inline {
argument "selection";
description
"Set the protobuf field 'inline' option on a container, list,
leaf-list, or leaf statement. Allowed values are 'true',
'false', and 'auto'. If 'auto' is specified, the behavior is
controlled by the enclosing container or list's protobuf-msg-flat
setting.
When applied to a container or list statement, this extension is
inherited by all enclosed objects, unless overridden.";
}
extension field-inline-max {
argument "limit";
description
"Set the protobuf field 'inline_max' option for list and
leaf-list statements. Allowed values are a positive decimal
integer, 'yang', or 'none'. Example limits:
'64'
'yang'
'none'
If 'none' is specified, then the inline_max protobuf extension
will not be used.
If 'yang' is specified, then the number of elements specified in
the yang 'max-elements' statement is used. If there is no
'max-elements' statement, the behavior defaults to 'none'.
If a decimal integer is specified, that number is used as the
maximum length.
If this extension is not specified, the behavior defaults to
'yang'. Descendant list and leaf-list objects do not inherit
this extension.";
}
extension field-string-max {
argument "limit";
description
"Set the protobuf field 'string_max' option for a leaf or
leaf-list of type string, binary, leafref, identityref, or
instance-identifier. Allowed values are a positive decimal
integer, 'yang', or 'none'. An optional encoding specifier may
also be specified, as octet or utf8, which specifies how
characters are counted. If specified, the encoding must come
first. Example limits:
'octet 64'
'utf8 20'
'utf8 yang'
'utf8'
'128'
'none'
If 'none' is specified, then the string_max protobuf extension
will not be used. 'none' cannot be combined with 'octet' or
'utf8'.
If 'yang' is specified, the yang type must be string or binary.
If the yang type includes the length statement, then the
statements maximum length is used as the length. Otherwise,
behavior defaults to 'none'.
If a decimal integer is specified, that number is used as the
length.
The encoding specifiers are used to determine the actual number
of bytes used in the protobuf extension. If the 'octet'
specifier is used, then the maximum length is used literally as
the byte length. If the 'utf8' specified is used, then the
maximum length is considered to be in terms of worst-case UTF-8
characters, in which case the protobuf byte length will actually
be 4 times the specified length.
For string and binary types, the default encoding is 'octet'.
For the remaining types, the default encoding is 'utf8',
reflecting those types fundemental description as XML entities
assumed to be encoded in UTF-8.
If this extension is not specified, then the default is 'yang'
for string and binary, and 'none' for the other types. This
extension cannot be specified on aggregate objects, and so it
cannot be inherited.";
}
extension field-tag {
argument "value";
description
"Set the protobuf field tag. Allowed values are a positive
decimal integer, 'auto', a base-relative addition expression, or
a field-relative addition expression.
If a decimal integer is specified, then the tag is set to the
specified number. You should avoid using this form in a
grouping, because you may not be able to guarantee uniqueness
across all the uses of the group. However, the syntax will be
allowed.
A base-relative addition expression allows the tag of a field to
be defined in terms of the base tag of an enclosing grouping,
container, list, or uses statement. The expression has the form
'+NUMBER', where NUMBER is the value to add to the base to derive
the current field's tag.
A field-relative addition expression allows the tag of one field
to be defined in terms of another field. The expression has the
form 'NAME+NUMBER', where NAME is the name of the other field,
and NUMBER is the value to add to the other fields tag to derive
the current field's tag.
If this extension is not specified, the default behavior is
'auto'.";
}
extension field-type {
argument "type";
description
"Override the default protobuf field type mapping for a leaf or
leaf-list type, and use the specified protobuf type instead.
Allowed values are any of the Protobuf scalar types, as
restricted by the yang leaf type:
+---------------------------+-------------------------------+
| (pseudo) yang leaf type | (pseudo) protobuf scalar type |
|---------------------------+-------------------------------+
| int8, int16, int32 | int32, sint32, sfixed32, auto |
+---------------------------+-------------------------------+
| int64 | int64, sint64, sfixed64, auto |
+---------------------------+-------------------------------+
| uint8, uint16, uint32 | uint32, fixed32, auto |
+---------------------------+-------------------------------+
| uint64 | uint64, fixed64, auto |
+---------------------------+-------------------------------+
| decimal | uint64, sint64, int64, |
| | fixed64, sfixed64, |
| | float, double, auto |
+---------------------------+-------------------------------+
| empty, boolean | bool, auto |
+---------------------------+-------------------------------+
| string, leafref, | string, auto |
| identityref, | |
| instance-identifier, | |
| anyxml | |
+---------------------------+-------------------------------+
| bits, binary | bytes, auto |
+---------------------------+-------------------------------+
If 'auto' is specified, the default conversion will be used. The
protobuf pseudo-type utf8 is equivalent to string, except that
length limits will be adjusted in protobuf extentions to allow
the string to be composed entirely of the maximum sized UTF-8
multibyte characters (byte length is 4 times larger than the
character length).";
}
extension field-c-type {
argument "type";
description
"Override the default protoc-c C-language type mapping for a leaf
or leaf-list type, and use the specified C type instead.";
}
/* ATTN: Stop using this extension? */
extension package-name {
argument "pkgname";
description
"Specifies the name of the package name in the generated .proto
file on a module statement The argument is the name of the
package-name. Allowed values are valid C identifiers When
package-name is not specified the generated package name defaults
to the Yang module name";
}
extension application-request-point {
description
"This extension is used temporarily until the config and data portions
are split into different namespaces and keyspecs. This allows
applications to provide data at a keyspec, and request config at a
different level";
}
extension enum-name {
argument "enumname";
description
"Use the specified name for the enum enumerator in the .proto
instead of the default mangled name of the yang identifer.
If there is a name conflict with other enum name either specified
explicitly or generated one, the yangpbc conversion will fail.
Allowed values are valid C identifiers.";
}
extension enum-type {
argument "enumtypename";
description
"Use the specified name for the enum type in the .proto instead
of the default mangled name of the yang identifier. If there is
a name conflict with another enum type, either auto-generated or
explicitly specified one, the yangpbc conversion will fail.
Allowed values are valid C identifiers.";
}
extension file-pbc-include {
argument "pathstring";
description
"A module level extension to specify the include files for pb-c.h
when any rift specific c-types are used. This extension can
occur multiple times as a child of module statement. The value
should be a valid path string.";
}
extension field-merge-behavior {
argument "value";
description
"An extension for controlling the merge done for listy types
during upacking of protobuf. It can take 3 different value:
1) default: The default is whatever protobuf-c does today
(for keyed lists, the default is equivalent to by-keys).
2) by-keys: allowed on keyed lists (and leaf-lists): merge
elements with matching key.
3) none: allowed on keyed lists (and leaf-lists): do not
attempt to merge elements. This must ONLY be used when it
is known or expected that the proto message would contain
large number of list items.";
}
} // rw-pb-ext