// Copyright 2020 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.lowpan.device;

using fuchsia.lowpan;

/// LoWPAN Provisioning Error
///
/// Returned by `ProvisioningMonitor.WatchProgress()`.
enum ProvisionError : int32 {
    /// Provisioning did not successfully complete because the
    /// credential was rejected. For example, the key was incorrect.
    ///
    /// This may be interpreted as an argument error.
    CREDENTIAL_REJECTED = 1;

    /// Provisioning did not successfully complete because the
    /// no peers on the requested network are in range.
    NETWORK_NOT_FOUND = 2;

    /// Forming a new network did not successfully complete because the
    /// a peer with the requested network identity is in range.
    NETWORK_ALREADY_EXISTS = 3;

    /// This operation was canceled due to an incompatible operation
    /// being started before this one was finished.
    CANCELED = 4;
};

/// Indicates the current status of the form/join operation.
///
/// Returned by `ProvisioningMonitor.WatchProgress()`.
union ProvisioningProgress {
    /// Approximate percent complete indication for a user interface.
    1: float32 progress;

    /// The final Identity when the operation has completed successfully.
    2: fuchsia.lowpan.Identity identity;
};

/// Reports the progress of a provisioning operation like Join or Form.
///
/// If there was a problem with the arguments passed to the originating
/// function (Join/Form) then the channel will be closed with `ZX_ERR_INVALID_ARGS`.
protocol ProvisioningMonitor {
    /// Call this method to receive an update on the provisioning progress.
    ///
    /// When first called, this method will return immediately with the
    /// current status. On subsequent calls, it will block until the status
    /// changes.
    ///
    /// If provisioning error is encountered, it is returned as a `ProvisionError`. See
    /// the documentation for `ProvisionError` details on error handling.
    ///
    /// Once the method has either returned an identity or indicated a `ProvisionError`,
    /// the ProvisioningMonitor will close with `ZX_OK`.
    WatchProgress() -> (ProvisioningProgress progress) error ProvisionError;
};
