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

/// A reference to a capability source or destination relative to this
/// component.
type Ref = flexible union {
    1: parent ParentRef;
    2: self SelfRef;
    3: child ChildRef;
    4: collection CollectionRef;
    5: framework FrameworkRef;
    6: capability CapabilityRef;
    7: debug DebugRef;
    8: void_type VoidRef;
};

/// A reference to a component's parent instance.
type ParentRef = struct {};

/// A reference to the component itself.
type SelfRef = struct {};

/// A reference to the environment's debug capabilities.
type DebugRef = struct {};

/// A reference to one of the component's child instances.
type ChildRef = struct {
    /// The name assigned to the child by its parent. If `collection` is set,
    /// `name` is scoped to `collection` and the child is a dynamic instance.
    /// Required.
    name child_name;
    /// The collection `name` belongs to. If omitted, `name` references a static
    /// instance. This field must be omitted if the `ChildRef` is being used in
    /// a component declaration. Optional.
    collection name:optional;
};

/// A reference to one of the component's collections.
type CollectionRef = struct {
    name name;
};

/// A reference to the component framework itself.
type FrameworkRef = struct {};

/// A reference to a capability declared in this component.
type CapabilityRef = struct {
    name string:MAX_NAME_LENGTH;
};

/// A reference to an intentionally missing offer source.
type VoidRef = struct {};
