// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.component.decl;

/// The string identifier for a config field.
alias ConfigKey = string:CONFIG_KEY_MAX_SIZE;

/// A SHA-256 hash produced over a component's config interface.
/// NOTE: 32 bytes is enough to encode a SHA-256 hash, max can be grown ABI-compatibly
alias ConfigChecksum = vector<uint8>:32;

/// Config keys can only consist of these many characters
const CONFIG_KEY_MAX_SIZE uint32 = 64;

/// The declaration of a component's configuration interface.
type Config = table {
    /// Ordered fields of the component's configuration interface.
    1: fields vector<ConfigField>:MAX;

    /// Checksum over the config declaration.
    2: declaration_checksum ConfigChecksum;
};

/// Declares a single config field (key + value type)
type ConfigField = table {
    /// The identifier for this config field.
    /// This key will be used to match overrides.
    1: key ConfigKey;

    /// The value type for this config field. Config values are verified
    /// against this type during build time and run time.
    2: value_type ConfigValueType;
};

/// Defines valid types for a config value
type ConfigValueType = flexible union {
    1: bool ConfigBooleanType;
    2: uint8 ConfigUnsigned8Type;
    3: uint16 ConfigUnsigned16Type;
    4: uint32 ConfigUnsigned32Type;
    5: uint64 ConfigUnsigned64Type;
    6: int8 ConfigSigned8Type;
    7: int16 ConfigSigned16Type;
    8: int32 ConfigSigned32Type;
    9: int64 ConfigSigned64Type;
   10: string ConfigStringType;
   11: vector ConfigVectorType;
};

/// This is an empty table for the boolean type
type ConfigBooleanType = table {};

/// This is an empty table for the uint8 type
type ConfigUnsigned8Type = table {};

/// This is an empty table for the uint16 type
type ConfigUnsigned16Type = table {};

/// This is an empty table for the uint32 type
type ConfigUnsigned32Type = table {};

/// This is an empty table for the uint64 type
type ConfigUnsigned64Type = table {};

/// This is an empty table for the int8 type
type ConfigSigned8Type = table {};

/// This is an empty table for the int16 type
type ConfigSigned16Type = table {};

/// This is an empty table for the int32 type
type ConfigSigned32Type = table {};

/// This is an empty table for the int64 type
type ConfigSigned64Type = table {};

type ConfigStringType = table {
    /// Maximum size of the string
    1: max_size uint32;
};

type ConfigVectorType = table {
    /// Maximum number of elements allowed in the vector
    1: max_count uint32;

    /// Type of elements stored in the vector
    2: element_type ConfigVectorElementType;
};

/// Defines valid types for elements stored in a vector.
/// This is different from `ConfigValueType` because vectors cannot store vectors.
type ConfigVectorElementType = flexible union {
    1: bool ConfigBooleanType;
    2: uint8 ConfigUnsigned8Type;
    3: uint16 ConfigUnsigned16Type;
    4: uint32 ConfigUnsigned32Type;
    5: uint64 ConfigUnsigned64Type;
    6: int8 ConfigSigned8Type;
    7: int16 ConfigSigned16Type;
    8: int32 ConfigSigned32Type;
    9: int64 ConfigSigned64Type;
   10: string ConfigStringType;
};
