...
| Code Block | ||
|---|---|---|
| ||
File : flow-classifier.yang
module flow-classifier {
yang-version 1;
namespace "sfc.flowclassifier";
prefix "flow-classifier";
import "ietf-yang-types" {
prefix "yang";
}
organization "ON-LAB";
description "This submodule defines for flow classifier.";
revision "2016-05-24" {
description "Initial revision.";
}
leaf id {
type yang:uuid;
}
}
File : ietf-yang-types.yang
module ietf-yang-types {
namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
prefix "yang";
organization
"IETF NETMOD (NETCONF Data Modeling Language) Working Group";
contact
"WG Web: <http://tools.ietf.org/wg/netmod/>
WG List: <mailto:netmod@ietf.org>
WG Chair: David Kessens
<mailto:david.kessens@nsn.com>
WG Chair: Juergen Schoenwaelder
<mailto:j.schoenwaelder@jacobs-university.de>
Editor: Juergen Schoenwaelder
<mailto:j.schoenwaelder@jacobs-university.de>";
description
"This module contains a collection of generally useful derived
YANG data types.
Copyright (c) 2013 IETF Trust and the persons identified as
authors of the code. All rights reserved.
Redistribution and use in source and binary forms, with or
without modification, is permitted pursuant to, and subject
to the license terms contained in, the Simplified BSD License
set forth in Section 4.c of the IETF Trust's Legal Provisions
Relating to IETF Documents
(http://trustee.ietf.org/license-info).
This version of this YANG module is part of RFC 6991; see
the RFC itself for full legal notices.";
revision 2013-07-15 {
description
"This revision adds the following new data types:
- yang-identifier
- hex-string
- uuid
- dotted-quad";
reference
"RFC 6991: Common YANG Data Types";
}
revision 2010-09-24 {
description
"Initial revision.";
reference
"RFC 6021: Common YANG Data Types";
}
typedef uuid {
type string {
pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
}
description
"A Universally Unique IDentifier in the string representation
defined in RFC 4122. The canonical representation uses
lowercase characters.
The following is an example of a UUID in string representation:
f81d4fae-7dec-11d0-a765-00a0c91e6bf6
";
reference
"RFC 4122: A Universally Unique IDentifier (UUID) URN
Namespace";
}
} |
Include
Overview
A module uses a include statement to include sub-module that belongs to module. The argument is the name of sub-module. Modules are only allowed to include sub-module that belongs to module, as defined by belongs-to statement. When a module includes a submodule, it incorporates the contents of the submodule into the node hierarchy of the module.
...
Please refer module example section
Belongs to
Overview
The "belongs-to" statement specifies the module to which the submodule belongs. The argument is an identifier that is the name of the module. A submodule must only be included by the module to which it belongs, or by another submodule that belongs to that module.
JAVA mapping
No java mapping for belongs to statement in generated code.
...
| Code Block | ||
|---|---|---|
| ||
File : AcmeSystemService.java
public interface AcmeSystemService {
String getHostName();
void setHostName(String hostName);
}
File: AcmeSystemManager.java
@Component (immediate = true)
@Service
public class AcmeSystemManager implements AcmeSystemService {
private final Logger log = getLogger(getClass());
@Activate
public void activate() {
//TODO: YANG utils generated code
log.info("Started");
}
@Deactivate
public void deactivate() {
//TODO: YANG utils generated code
log.info("Stopped");
}
@Override
public String getHostName() {
//TODO: YANG utils generated code
return null;
}
@Override
public void setHostName(String hostName) {
//TODO: YANG utils generated code
}
} |
Leaf-list
Overview
A leaf-list is also used for defining scalar variable, like leaf, but in an array of a particular type. The type of the variable can be either built-in type or a derived type.
...
| Code Block | ||
|---|---|---|
| ||
File : AcmeSystemManager.java
@Component (immediate = true)
@Service
public class AcmeSystemManager implements AcmeSystemService {
private final Logger log = getLogger(getClass());
@Activate
public void activate() {
//TODO: YANG utils generated code
log.info("Started");
}
@Deactivate
public void deactivate() {
//TODO: YANG utils generated code
log.info("Stopped");
}
@Override
public List<Short> getDomainSearch() {
//TODO: YANG utils generated code
return null;
}
@Override
public void setDomainSearch(List<Short> domainSearch) {
//TODO: YANG utils generated code
}
} |
Container
Overview
Container is a holder that can hold many nodes within it. It is used for logically grouping certain set of nodes.
...
| Code Block | ||
|---|---|---|
| ||
File : System.java
public interface System extends AugmentationHolder {
String hostName();
List<String> domainSearch();
interface SystemBuilder {
String hostName();
List<String> domainSearch();
SystemBuilder hostName(String hostName);
SystemBuilder domainSearch(List<String> domainSearch);
System build();
}
}
File : SystemBuilder.java
public class SystemBuilder implements System.SystemBuilder {
private String hostName;
private List<String> domainSearch;
public String hostName() {
return hostName;
}
public List<String> domainSearch() {
return domainSearch;
}
public SystemBuilder hostName(String hostName) {
this.hostName = hostName;
return this;
}
public SystemBuilder domainSearch(List<String> domainSearch) {
this.domainSearch = domainSearch;
return this;
}
.
.
.
public final class SystemImpl implements System {
.
.
.
}
}
File : Holder.java
public interface Holder extends AugmentationHolder {
System system();
interface HolderBuilder {
System system();
HolderBuilder system(System system);
Holder build();
}
}
File : HolderBuilder.java
public class HolderBuilder implements Holder.HolderBuilder {
private System system;
public System system() {
return system;
}
public HolderBuilder system(System system) {
this.system = system;
return this;
}
public Holder build() {
return new HolderImpl(this);
}
.
.
.
public final class HolderImpl implements Holder {
.
.
.
}
} |
List
Overview
List is also like container that can hold many nodes by logically grouping. The only difference is, list can have multiple instances whereas container has only one instance.
...
| Code Block | ||
|---|---|---|
| ||
File : User.java
public interface User extends AugmentationHolder {
String name();
String fullName();
String yangAutoPrefixClass();
interface UserBuilder {
String name();
String fullName();
String yangAutoPrefixClass();
UserBuilder name(String name);
UserBuilder fullName(String fullName);
UserBuilder yangAutoPrefixClass(String yangAutoPrefixClass);
User build();
}
}
File : UserBuilder.java
public class UserBuilder implements User.UserBuilder {
private String name;
private String fullName;
private String yangAutoPrefixClass;
public String name() {
return name;
}
public String fullName() {
return fullName;
}
public String yangAutoPrefixClass() {
return yangAutoPrefixClass;
}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder fullName(String fullName) {
this.fullName = fullName;
return this;
}
public UserBuilder yangAutoPrefixClass(String yangAutoPrefixClass) {
this.yangAutoPrefixClass = yangAutoPrefixClass;
return this;
}
.
.
.
public final class UserImpl implements User {
.
.
.
}
}
File : User.java
public interface User extends AugmentationHolder {
String name();
List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user();
interface UserBuilder {
String name();
List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user();
UserBuilder name(String name);
UserBuilder user(List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user);
User build();
}
}
File : UserBuilder.java
public class UserBuilder implements User.UserBuilder {
private String name;
private List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user;
public String name() {
return name;
}
public List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user() {
return user;
}
public UserBuilder name(String name) {
this.name = name;
return this;
}
public UserBuilder user(List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20160520.acmesystem.user.User> user) {
this.user = user;
return this;
}
.
.
.
public final class UserImpl implements User {
.
.
.
}
}
|
...
| Code Block | ||
|---|---|---|
| ||
File : Test.yang
module Test {
.
.
.
grouping Percentage {
leaf mark{
type String;
}
}
container classroom {
leaf student{
type String;
}
uses Percentage;
}
} |
Choice and case
Overview
The choice statement defines a set of alternatives, only one of which may exist at any one time. The argument is an identifier, followed by a block of sub-statements that holds detailed choice information.
...
Interface file which extends choice marker interface
Builder class which implements the builder interface and impl class which implements the interface
- Impl class includes overridden methods, hashcode, equals, toString methods.
Example
| Code Block | ||
|---|---|---|
| ||
File : link.yang
module link {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
container link {
choice interfaceType {
case ethernerType {
leaf ethernet { type string; }
}
case p2pType {
leaf p2p { type string; }
}
}
}
} |
| Code Block | ||
|---|---|---|
| ||
File : InterfaceType.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160509.choicecasetest.link1;
import org.onosproject.yangutils.translator.tojava.AugmentationHolder;
public interface InterfaceType extends AugmentationHolder {
}
File : EthernerType.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160509.choicecasetest.link1.interfacetype;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160509.choicecasetest.link1.InterfaceType;
import org.onosproject.yangutils.translator.tojava.AugmentationHolder;
public interface EthernerType extends AugmentationHolder, InterfaceType {
String ethernet();
interface EthernerTypeBuilder {
String ethernet();
EthernerTypeBuilder ethernet(String ethernet);
EthernerType build();
}
}
File : EthernerTypeBuilder.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160509.choicecasetest.link1.interfacetype;
import com.google.common.base.MoreObjects;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import org.onosproject.yangutils.translator.tojava.AugmentedInfo;
public class EthernerTypeBuilder implements EthernerType.EthernerTypeBuilder {
private String ethernet;
@Override
public String ethernet() {
return ethernet;
}
@Override
public EthernerTypeBuilder ethernet(String ethernet) {
this.ethernet = ethernet;
return this;
}
@Override
public EthernerType build() {
return new EthernerTypeImpl(this);
}
public EthernerTypeBuilder() {
}
public final class EthernerTypeImpl implements EthernerType {
private String ethernet;
@Override
public String ethernet() {
return ethernet;
}
public EthernerTypeImpl() {
}
public EthernerTypeImpl(EthernerTypeBuilder builderObject) {
this.ethernet = builderObject.ethernet();
}
}
} |
RPC
Overview
RPCs are modeled with RPC statement. The input statement is used to define input parameters to the RPC and output statement is used to define output parameters to the RPC.
...
When input is present and no output statement.
When input has only one leaf/leaf-list. In this case method signature will have return type as “void” and member attribute with type of leaf.
When input has only one YANG construct. In this case method signature will have return type as “void” and a class will be generated for construct which will be used as the type of method’s attribute..
When input has multiple leaf/leaf-list/YANG construct, one class will be generated for input and that will be used as type of method’s attribute and return type will be void.
When no input and output statement is present.
When output has only one leaf/leaf-list. In this case method signature will have return type as type of leaf and no member attribute.
When output has only one YANG construct. In this case method signature will have return type as class which is generated for construct and no method attribute will be generated.
- When output has multiple leaf/leaf-list/YANG construct, one class will be generated for output and that will be used as type of method’s return type.
- When input is present and output statement is present.
When input has only one leaf/leaf-list and output has only leaf/leaf-list. In this case method signature will have return type as type of leaf/list of output and member attribute with type of leaf/leaf-lists type input.
When input has only one YANG construct and output has one YANG construct. In this case method signature will have return type as generated class of outputs construct and a class will be generated for inputs construct which will be used as the type of method’s attribute.
- When input has multiple leaf/leaf-list/YANG construct, and output has leaf/leaf-list/YANG construct one class will be generated for input and that will be used as type of method’s attribute and class will be generated for output which will be used as return type of method.
Example
| Code Block | ||
|---|---|---|
| ||
File: sfc.yang
module Sfc {
yang-version 1;
namespace http://huawei.com;
prefix Ant;
rpc SFP {
input {
leaf port {
type string;
}
}
output {
leaf path {
type string;
}
}
}
} |
| Code Block | ||
|---|---|---|
| ||
File : SfcService.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpInput;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpOutput;
public interface SfcService {
SfpOutput sfp(SfpInput inputVar);
}
File : SfcManager.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpInput;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp.SfpOutput;
import org.slf4j.Logger;
import static org.slf4j.LoggerFactory.getLogger;
@Component (immediate = true)
@Service
public class SfcManager implements SfcService {
private final Logger log = getLogger(getClass());
@Activate
public void activate() {
//TODO: YANG utils generated code
log.info("Started");
}
@Deactivate
public void deactivate() {
//TODO: YANG utils generated code
log.info("Stopped");
}
@Override
public SfpOutput sfp(SfpInput inputVar) {
//TODO: YANG utils generated code
return null;
}
}
File : SfpInput.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;
public interface SfpInput {
String port();
interface SfpInputBuilder {
String port();
SfpInputBuilder port(String port);
SfpInput build();
}
}
File : SfpinputBuilder.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;
import com.google.common.base.MoreObjects;
import java.util.Objects;
public class SfpInputBuilder implements SfpInput.SfpInputBuilder {
private String port;
@Override
public String port() {
return port;
}
@Override
public SfpInputBuilder port(String port) {
this.port = port;
return this;
}
@Override
public SfpInput build() {
return new SfpInputImpl(this);
}
public SfpInputBuilder() {
}
public final class SfpInputImpl implements SfpInput {
private String port;
@Override
public String port() {
return port;
}
@Override
public int hashCode() {
return Objects.hash(port);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SfpInputImpl) {
SfpInputImpl other = (SfpInputImpl) obj;
return
Objects.equals(port, other.port);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("port", port)
.toString();
}
public SfpInputImpl(SfpInputBuilder builderObject) {
this.port = builderObject.port();
}
}
}
File : Sfpoutput.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;
public interface SfpOutput {
String path();
interface SfpOutputBuilder {
String path();
SfpOutputBuilder path(String path);
SfpOutput build();
}
}
File : SfpOutputBuilder.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.sfc.sfp;
import com.google.common.base.MoreObjects;
import java.util.Objects;
public class SfpOutputBuilder implements SfpOutput.SfpOutputBuilder {
private String path;
@Override
public String path() {
return path;
}
@Override
public SfpOutputBuilder path(String path) {
this.path = path;
return this;
}
@Override
public SfpOutput build() {
return new SfpOutputImpl(this);
}
public SfpOutputBuilder() {
}
public final class SfpOutputImpl implements SfpOutput {
private String path;
@Override
public String path() {
return path;
}
@Override
public int hashCode() {
return Objects.hash(path);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof SfpOutputImpl) {
SfpOutputImpl other = (SfpOutputImpl) obj;
return Objects.equals(path, other.path);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("path", path)
.toString();
}
public SfpOutputImpl(SfpOutputBuilder builderObject) {
this.path = builderObject.path();
}
}
} |
Notification
Overview
The "notification" statement is used to define a notification. It takes one argument, which is an identifier, followed by a block of substatements that holds detailed notification information.
...
When notification statement is present in YANG, an event class , event subject class, event listener interface and notification interface and builder will be generated.
When multiple notifications are present event class include the an enum with types of events for all notification like DEVICE_ADDED, DEVICE_REMOVED and it extends AbstractEvent with event type and event subject class. It is used to notify EventListeners about the event.
...
| Code Block | ||
|---|---|---|
| ||
File : AugmentedInterface.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test;
import org.onosproject.yangutils.utils.AugmentedInfo;
public interface AugmentedInterface extends AugmentedInfo {
short getDs0ChannelNumber();
interface AugmentedInterfaceBuilder {
short getDs0ChannelNumber();
AgmentedInterfaceBuilder setDs0ChannelNumber(short ds0ChannelNumber);
AugmentedInterface build();
}
}
File : AugmentedInterfaceBuilder.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test;
import java.util.Objects;
import com.google.common.base.MoreObjects;
import org.onosproject.yang.gen.v1.http.huawei.com.rev20160428.test.InterfaceBuilder.InterfaceImpl;
public class AugmentedInterfaceBuilder implements AugmentedInterface.AugmentedInterfaceBuilder {
private short ds0ChannelNumber;
@Override
public short getDs0ChannelNumber() {
return ds0ChannelNumber;
}
@Override
public AugmentedInterfaceBuilder setDs0ChannelNumber(short ds0ChannelNumber) {
this.ds0ChannelNumber = ds0ChannelNumber;
return this;
}
@Override
public AugmentedInterface build() {
return new AugmentedInterfaceImpl(this);
}
public AugmentedInterfaceBuilder() {
}
public final class AugmentedInterfaceImpl implements AugmentedInterface {
private short ds0ChannelNumber;
@Override
public short getDs0ChannelNumber() {
return ds0ChannelNumber;
}
@Override
Public int hashCode() {
return Objects.hash(ds0ChannelNumber);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof AugmentedInterfaceImpl) {
AugmentedInterfaceImpl other = (AugmentedInterfaceImpl) obj;
return
Objects.equals(ds0ChannelNumber, other.ds0ChannelNumber);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("ds0ChannelNumber", ds0ChannelNumber)
.toString();
}
Public AugmentedInterfaceImpl(AugmentedInterfaceBuilder builderObject) {
this.ds0ChannelNumber = builderObject.getDs0ChannelNumber();
InterfaceImpl interfaceImpl = new InterfaceBuilder().new InterfaceImpl();
interfaceImpl.addAugmentation(this);
}
}
} |
Type
Overview
The "type" statement takes as an argument a string that is the name of a YANG built-in type or a derived type, followed by an optional block of sub statements that are used to put further restrictions on the type.
...
YANG | Description | JAVA |
|---|---|---|
binary | Any binary data | To be implemented |
bits | A set of bits or flags | To be implemented |
boolean | "True" or "false" | boolean |
decimal64 | 64-bit signed decimal number | To be implemented |
empty | A leaf that does not have any value | boolean |
enumeration | Enumerated strings | Enum class will be generated |
identityref | A reference to an abstract identity | To be implemented |
instance-identifier | References a data tree node | To be implemented |
int8 | 8-bit signed integer | byte |
int16 | 16-bit signed integer | short |
int32 | 32-bit signed integer | int |
int64 | 64-bit signed integer | long |
leafref | A reference to a leaf instance | To be implemented |
string | Human-readable string | String |
uint8 | 8-bit unsigned integer | short |
uint16 | 16-bit unsigned integer | int |
uint32 | 32-bit unsigned integer | long |
uint64 | 64-bit unsigned integer | BigInteger |
union | Choice of member types | Union class will be generated |
Example
| Code Block | ||
|---|---|---|
| ||
leaf one {
type string;
}
leaf two {
type int32;
}
leaf-list three {
type boolean;
}
leaf-list four {
type int16;
} |
...
| Code Block | ||
|---|---|---|
| ||
File : Percent.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.test;
import java.util.Objects;
import com.google.common.base.MoreObjects;
public final class Percent {
private short uint8;
private Percent() {
}
public Percent(short value) {
this.uint8 = value;
}
public static Percent of(short value) {
return new Percent(value);
}
public short uint8() {
return uint8;
}
@Override
public int hashCode() {
return Objects.hash(uint8);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof Percent) {
Percent other = (Percent) obj;
return Objects.equals(uint8, other.uint8);
}
return false;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(getClass())
.add("uint8", uint8)
.toString();
}
public static Percent fromString(String valInString) {
try {
short tmpVal = Short.parseShort(valInString);
return of(tmpVal);
} catch (Exception e) {
}
return null;
}
} |
Enumeration
Overview
Enum statement only can come when a leaf is of type enumeration. Each enum has one string then should be unique . The string must not be empty string and must not have white spaces. Enum can have sub statements, value statement will give the info about its value. If the enum statement in enumeration has no value statement then its value is considered as zero and subsequently incremented by one for next values.
Java mapping
For a given enumeration node one enum file will be generated which will have all the enum as its attributes. There will be a constructor and a getter method for the values.
Example
| Code Block | ||
|---|---|---|
| ||
File: test.yang
module Test {
yang-version 1;
namespace "http://huawei.com";
prefix Ant;
description "Interval before a route is declared invalid";
leaf packetType {
type enumeration {
enum "unbounded";
enum ZERO;
enum two;
enum four;
}
}
} |
| Code Block | ||
|---|---|---|
| ||
File : PacketTypeEnum.java
package org.onosproject.yang.gen.v1.http.huawei.com.rev20160526.test;
public enum PacketTypeEnum {
UNBOUNDED(0),
ZERO(1),
TWO(2),
FOUR(3);
private int packetTypeEnum;
PacketTypeEnum(int value) {
packetTypeEnum = value;
}
public static PacketTypeEnum of(int value) {
switch (value) {
case 0:
return PacketTypeEnum.UNBOUNDED;
case 1:
return PacketTypeEnum.ZERO;
case 2:
return PacketTypeEnum.TWO;
case 3:
return PacketTypeEnum.FOUR;
default :
return null;
}
}
public int packetTypeEnum() {
return packetTypeEnum;
}
public static PacketTypeEnum fromString(String valInString) {
try {
int tmpVal = Integer.parseInt(valInString);
return of(tmpVal);
} catch (Exception e) {
}
return null;
}
} |
Union
Overview
Union is a built in type which represents its member types. Union can have multiple member types. To use union there must be a type statement. Except empty and leafref all types can come under union.
When a value comes for union , which can match to multiple member types of union, then in that case to whichever type value matches from the member types defined in union value, will be taken from union as the values type.
Java mapping
For a given union node one class file will be generated which will have all the an attribute with the type union is having. There will be a constructor , getter method, of method, fromString, HashCode, equals and ToString methods for the values.
Example
| Code Block | ||
|---|---|---|
| ||
File : test.yang
module test {
yang-version 1;
namespace "http://huawei.com";
prefix "test";
typedef ip-address {
type union {
type int32;
type uint32;
}
}
} |
...