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

const MAX_NAME_LENGTH uint32 = 100;
const MAX_CHILD_NAME_LENGTH uint32 = 1024;
const MAX_PATH_LENGTH uint32 = 1024;
const MAX_MONIKER_LENGTH uint32 = 4096;
const MAX_URL_SCHEME_LENGTH uint32 = 100;

alias name = string:MAX_NAME_LENGTH;
alias child_name = string:MAX_CHILD_NAME_LENGTH;
alias url_scheme = string:MAX_URL_SCHEME_LENGTH;
/// Path in a dictionary. The format is similar to a directory path, except no `.` or `..`.
/// is allowed and each path segment must conform to the format of the `name` type.
///
/// The "dirname" (first to the penultimate segment, or empty if there is one
/// segment) represents a sequence of nested dictionaries.
/// The "basename" (last segment) identifies a capability in the last nested
/// dictionary.
@available(added=HEAD)
alias dictionary_path = string:MAX_PATH_LENGTH;

/// `DeliveryType` may be used when declaring a capability, and specifies under
/// what conditions the framework will open the capability from the provider
/// component's outgoing directory when there is a request for this capability.
@available(added=HEAD)
type DeliveryType = flexible enum {
    /// The framework will open the capability as soon as some consumer
    /// component requests it.
    IMMEDIATE = 0;

    /// The framework will monitor the `ZX_CHANNEL_READABLE` signal on the
    /// server endpoint of connection requests made by the consumer component,
    /// and only open the capability from the provider component's outgoing
    /// directory when the server endpoint becomes readable.
    ON_READABLE = 1;
};
