pocketstation 1.0.0

Source-aware desktop audio Session SDK
use crate::frame::{EndpointId, SessionId, StemId};

use crate::session::{OperatorInstanceId, SourceInstanceId};

#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
pub enum SessionError {
    #[error("session must contain at least one built-in or external source")]
    NoSources,
    #[error("stem {stem_id:?} has no destination route")]
    NoRoutes { stem_id: StemId },
    #[error("external source instance {source_instance_id:?} has no declared output")]
    NoSourceOutputs {
        source_instance_id: SourceInstanceId,
    },
    #[error(
        "external source instance {source_instance_id:?} output '{output_port}' has no destination route"
    )]
    NoSourceOutputRoutes {
        source_instance_id: SourceInstanceId,
        output_port: String,
    },
    #[error("invalid source selector: {reason}")]
    InvalidSelector { reason: String },
    #[error("endpoint descriptor is invalid: {reason}")]
    InvalidEndpoint { reason: String },
    #[error("operator descriptor is invalid: {reason}")]
    InvalidOperator { reason: String },
    #[error("route descriptor is invalid: {reason}")]
    InvalidRoute { reason: String },
    #[error("endpoint belongs to session {actual:?}, expected {expected:?}")]
    ForeignEndpoint {
        expected: SessionId,
        actual: SessionId,
    },
    #[error("session draft {session_id:?} is already frozen")]
    DraftFrozen { session_id: SessionId },
    #[error("session draft lock is poisoned")]
    DraftPoisoned,
    #[error("session identifier space is exhausted")]
    IdExhausted,
    #[error("unsupported SessionSpec version {major}.{minor}")]
    UnsupportedVersion { major: u16, minor: u16 },
    #[error("route references unknown endpoint {endpoint_id:?}")]
    UnknownEndpoint { endpoint_id: EndpointId },
    #[error("route references unknown stem {stem_id:?}")]
    UnknownStem { stem_id: StemId },
    #[error("route references unknown external source instance {source_instance_id:?}")]
    UnknownSourceInstance {
        source_instance_id: SourceInstanceId,
    },
    #[error(
        "route references unknown output '{output_port}' on external source instance {source_instance_id:?}"
    )]
    UnknownSourceOutput {
        source_instance_id: SourceInstanceId,
        output_port: String,
    },
    #[error("route references unknown operator instance {operator_instance_id:?}")]
    UnknownOperatorInstance {
        operator_instance_id: OperatorInstanceId,
    },
    #[error("operator instance {operator_instance_id:?} has no terminal destination")]
    OperatorHasNoDestination {
        operator_instance_id: OperatorInstanceId,
    },
}