// Copyright 2016 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.media.playback;

/// Models a problem preventing intended operation.
///
/// A `Problem` is generally surfaced as part of a component's status, probably
/// as an optional field. Absence of a `Problem` means that nothing is preventing
/// intended operation. When a problem is exposed, the client can take action
/// automatically or present relevant UI. If a problem can be resolved by some
/// action, the client may take that action automatically or enlist the user
/// somehow in the resolution. In either case, the problem goes away when the
/// issue that caused it to be exposed is resolved. By design, there is no
/// general means of dismissing a problem.
type Problem = struct {
    /// The type of problem. This is a string for extensibility.
    type string;

    /// Type-dependent details.
    details string:optional;
};

const PROBLEM_INTERNAL string = "fuchsia.media.playback.Internal";
const PROBLEM_ASSET_NOT_FOUND string = "fuchsia.media.playback.AssetNotFound";
const PROBLEM_CONTAINER_NOT_SUPPORTED string = "fuchsia.media.playback.ContainerNotSupported";
const PROBLEM_AUDIO_ENCODING_NOT_SUPPORTED string
        = "fuchsia.media.playback.AudioEncodingNotSupported";
const PROBLEM_VIDEO_ENCODING_NOT_SUPPORTED string
        = "fuchsia.media.playback.VideoEncodingNotSupported";
const PROBLEM_CONNECTION_FAILED string = "fuchsia.media.playback.ConnectionFailed";
