+/* 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