// 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;

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

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

/// The checksum produced for a configuration interface.
/// Two configuration interfaces are the same if their checksums are the same.
type ConfigChecksum = flexible union {
    /// A SHA-256 hash produced over a component's config interface.
    1: sha256 array<uint8, 32>;
};

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

    /// Checksum over the config declaration.
    2: checksum ConfigChecksum;

    /// Strategy used to resolve config values.
    3: value_source ConfigValueSource;
};

/// Strategies available for resolving configuration values.
type ConfigValueSource = flexible union {
    /// The path within the component's package at which to find config value files.
    1: package_path string:MAX;
};

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

    /// The type of config values. Config values are verified
    /// against this layout at build time and run time.
    2: type ConfigType;
};

// The type of a config value
type ConfigType = struct {
    layout ConfigTypeLayout;
    // This optional is not necessary, but without it,
    // FIDL compilation complains because of a possible include-cycle.
    // Bug: http://fxbug.dev/66350
    parameters vector<LayoutParameter>:<MAX, optional>;
    constraints vector<LayoutConstraint>:MAX;
};

// Defines valid type ids for config fields.
type ConfigTypeLayout = flexible enum {
    BOOL = 1;
    UINT8 = 2;
    UINT16 = 3;
    UINT32 = 4;
    UINT64 = 5;
    INT8 = 6;
    INT16 = 7;
    INT32 = 8;
    INT64 = 9;
    STRING = 10;
    VECTOR = 11;
};

// Parameters of a given type layout
type LayoutParameter = flexible union {
    // For vectors, this is the type of the nested element.
    1: nested_type ConfigType;
};

// Constraints on a given type layout
type LayoutConstraint = flexible union {
    // For strings, this is the maximum number of bytes allowed.
    // For vectors, this is the maximum number of elements allowed.
    1: max_size uint32;
};
