// Copyright 2019 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.
@available(added=7)
library fuchsia.castconfig;

using fuchsia.mem;

/// Error codes for the Watch operation.
type ErrorCode = strict enum {
    /// Error when there is no cast config available.
    NO_CAST_CONFIG = 1;
    /// Generic error.
    INTERNAL = 2;
};

/// Interface that provides cast config data.
@discoverable
closed protocol Provider {
    /// Requests a buffer containing cast config data.
    /// This call implements the Hanging Get protocol as detailed in
    /// https://fuchsia.dev/fuchsia-src/concepts/api/fidl#hanging-get
    ///
    /// All error cases are terminal, clients should not retry on error.
    strict Watch() -> (resource struct {
        config fuchsia.mem.Buffer;
    }) error ErrorCode;

    /// Notifies the config provider of the config status.
    ///
    /// `processed`: `true` if successfully received and processed
    /// `retry`: If `processed` is `false` config provider determines if a retry
    ///  is appropriate.
    strict Notify(struct {
        processed bool;
    }) -> (struct {
        retry bool;
    });
};
