/*
 * Copyright 2016 Open Networking Laboratory
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.onosproject.yangutils.datamodel;

/**
 * ENUM to identify the YANG data type.
 */
public enum YangDataTypes {
    /**
     * Reference:RFC 6020.
     * int8 represents integer values between -128 and 127, inclusively.
     */
    INT8,

    /**
     * Reference:RFC 6020.
     * int16 represents integer values between -32768 and 32767, inclusively.
     */
    INT16,

    /**
     * Reference:RFC 6020.
     * int32 represents integer values between -2147483648 and 2147483647,
     * inclusively.
     */
    INT32,

    /**
     * Reference:RFC 6020.
     * int64 represents integer values between -9223372036854775808 and
     * 9223372036854775807, inclusively.
     */
    INT64,

    /**
     * Reference:RFC 6020.
     * uint8 represents integer values between 0 and 255, inclusively.
     */
    UINT8,

    /**
     * Reference:RFC 6020.
     * uint16 represents integer values between 0 and 65535, inclusively.
     */
    UINT16,

    /**
     * Reference:RFC 6020.
     * uint32 represents integer values between 0 and 4294967295, inclusively.
     */
    UINT32,

    /**
     * Reference:RFC 6020.
     * uint64 represents integer values between 0 and 18446744073709551615,
     * inclusively.
     */
    UINT64,

    /**
     * Reference:RFC 6020.
     * The decimal64 type represents a subset of the real numbers, which can be
     * represented by decimal numerals. The value space of decimal64 is the set
     * of numbers that can be obtained by multiplying a 64-bit signed integer by
     * a negative power of ten, i.e., expressible as "i x 10^-n" where i is an
     * integer64 and n is an integer between 1 and 18, inclusively.
     */
    DECIMAL64, // TODO: need to implement in type.

    /**
     * Reference:RFC 6020.
     * The string built-in type represents human-readable strings in YANG. Legal
     * characters are tab, carriage return, line feed, and the legal characters
     * of Unicode and ISO/IEC 10646
     */
    STRING,

    /**
     * Reference:RFC 6020.
     * The boolean built-in type represents a boolean value.
     */
    BOOLEAN,

    /**
     * Reference:RFC 6020.
     * The enumeration built-in type represents values from a set of assigned
     * names.
     */
    ENUMERATION,

    /**
     * Reference:RFC 6020.
     * The bits built-in type represents a bit set. That is, a bits value is a
     * set of flags identified by small integer position numbers starting at 0.
     * Each bit number has an assigned name.
     */
    BITS,

    /**
     * Reference:RFC 6020.
     * The binary built-in type represents any binary data, i.e., a sequence of
     * octets.
     */
    BINARY,

    /**
     * Reference:RFC 6020.
     * The leafref type is used to reference a particular leaf instance in the
     * data tree. The "path" sub-statement (Section 9.9.2) selects a set of leaf
     * instances, and the leafref value space is the set of values of these leaf
     * instances.
     *
     * If the leaf with the leafref type represents configuration data, the leaf
     * it refers to MUST also represent configuration. Such a leaf puts a
     * constraint on valid data. All leafref nodes MUST reference existing leaf
     * instances or leafs with default values in use for the data to be valid.
     *
     * There MUST NOT be any circular chains of leafrefs.
     *
     * If the leaf that the leafref refers to is conditional based on one or
     * more features, then the leaf with the leafref type MUST also be
     * conditional based on at least the same set of features.
     */
    LEAFREF, // TODO: need to implement in type.

    /**
     * Reference:RFC 6020.
     * The identityref type is used to reference an existing identity.
     */
    IDENTITYREF,

    /**
     * Reference:RFC 6020.
     * The empty built-in type represents a leaf that does not have any value,
     * it conveys information by its presence or absence.
     *
     * An empty type cannot have a default value.
     */
    EMPTY,

    /**
     * Reference:RFC 6020.
     * The union built-in type represents a value that corresponds to one of its
     * member types.
     *
     * When the type is "union", the "type" statement MUST be present. It is
     * used to repeatedly specify each member type of the union. It takes as an
     * argument a string that is the name of a member type.
     *
     * A member type can be of any built-in or derived type, except it MUST NOT
     * be one of the built-in types "empty" or "leafref".
     *
     * When a string representing a union data type is validated, the string is
     * validated against each member type, in the order they are specified in
     * the "type" statement, until a match is found.
     *
     * Any default value or "units" property defined in the member types is not
     * inherited by the union type.
     */
    UNION,

    /**
     * Reference:RFC 6020.
     * The instance-identifier built-in type is used to uniquely identify a
     * particular instance node in the data tree.
     *
     * The syntax for an instance-identifier is a subset of the XPath
     * abbreviated syntax, formally defined by the rule "instance-identifier".
     * It is used to uniquely identify a node in the data tree. Predicates are
     * used only for specifying the values for the key nodes for list entries, a
     * value of a leaf-list entry, or a positional index for a list without
     * keys. For identifying list entries with keys, each predicate consists of
     * one equality test per key, and each key MUST have a corresponding
     * predicate.
     *
     * If the leaf with the instance-identifier type represents configuration
     * data, and the "require-instance" property is "true", the node it refers
     * to MUST also represent configuration. Such a leaf puts a constraint on
     * valid data. All such leaf nodes MUST reference existing nodes or leaf
     * nodes with their default value in use for the data to be valid.
     */
    INSTANCE_IDENTIFIER,

    /**
     * Derived Data type.
     */
    DERIVED
}
