1use std::ffi::{NulError, c_int};
6use std::str::Utf8Error;
7
8pub type Result<T> = std::result::Result<T, Error>;
13
14pub(crate) fn error_to_result_code(value: c_int) -> Result<i32> {
16 if value >= 0 {
17 Ok(value)
18 } else {
19 Err(Error::from(value))
20 }
21}
22
23pub(crate) fn error_to_result(value: c_int) -> Result<()> {
25 if value >= 0 {
26 Ok(())
27 } else {
28 Err(Error::from(value))
29 }
30}
31
32#[derive(Debug, Clone)]
34pub struct VersionError {
35 pub expected: u64,
37 pub found: u64,
39}
40
41#[derive(Debug)]
43pub struct DebugLoc {
44 pub file: &'static str,
46 pub line: u32,
48 pub function: &'static str,
50 pub variable: Option<&'static str>,
52}
53
54#[derive(Debug)]
56pub enum RustError {
57 InvalidUtf8(Utf8Error),
59 InteriorNull(NulError),
61 VersionMismatch(VersionError),
63 Pointer(Option<DebugLoc>),
67}
68
69#[derive(Debug)]
71pub enum Error {
72 Success(i32),
76 EventQueueFull,
78 NoMemory,
80 Uninitialized,
82 InvalidParameter,
84 OptionNotFound,
86 OptionFormat,
88 OptionError,
90 PropertyNotFound,
92 PropertyFormat,
94 PropertyUnavailable,
96 PropertyError,
98 Command,
100 LoadingFailed,
102 AoInitFailed,
104 VoInitFailed,
106 NothingToPlay,
108 UnknownFormat,
110 Unsupported,
112 NotImplemented,
114 Generic,
116 Rust(RustError),
118}
119
120impl From<Utf8Error> for Error {
121 fn from(value: Utf8Error) -> Self {
122 Self::Rust(RustError::InvalidUtf8(value))
123 }
124}
125
126impl From<NulError> for Error {
127 fn from(value: NulError) -> Self {
128 Self::Rust(RustError::InteriorNull(value))
129 }
130}
131
132impl From<c_int> for Error {
133 fn from(value: c_int) -> Self {
134 match value {
135 value @ 0.. => Error::Success(value),
136 libmpv_client_sys::mpv_error_MPV_ERROR_EVENT_QUEUE_FULL => Error::EventQueueFull,
137 libmpv_client_sys::mpv_error_MPV_ERROR_NOMEM => Error::NoMemory,
138 libmpv_client_sys::mpv_error_MPV_ERROR_UNINITIALIZED => Error::Uninitialized,
139 libmpv_client_sys::mpv_error_MPV_ERROR_INVALID_PARAMETER => Error::InvalidParameter,
140 libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_NOT_FOUND => Error::OptionNotFound,
141 libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_FORMAT => Error::OptionFormat,
142 libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_ERROR => Error::OptionError,
143 libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_NOT_FOUND => Error::PropertyNotFound,
144 libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_FORMAT => Error::PropertyFormat,
145 libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_UNAVAILABLE => Error::PropertyUnavailable,
146 libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_ERROR => Error::PropertyError,
147 libmpv_client_sys::mpv_error_MPV_ERROR_COMMAND => Error::Command,
148 libmpv_client_sys::mpv_error_MPV_ERROR_LOADING_FAILED => Error::LoadingFailed,
149 libmpv_client_sys::mpv_error_MPV_ERROR_AO_INIT_FAILED => Error::AoInitFailed,
150 libmpv_client_sys::mpv_error_MPV_ERROR_VO_INIT_FAILED => Error::VoInitFailed,
151 libmpv_client_sys::mpv_error_MPV_ERROR_NOTHING_TO_PLAY => Error::NothingToPlay,
152 libmpv_client_sys::mpv_error_MPV_ERROR_UNKNOWN_FORMAT => Error::UnknownFormat,
153 libmpv_client_sys::mpv_error_MPV_ERROR_UNSUPPORTED => Error::Unsupported,
154 libmpv_client_sys::mpv_error_MPV_ERROR_NOT_IMPLEMENTED => Error::NotImplemented,
155 libmpv_client_sys::mpv_error_MPV_ERROR_GENERIC => Error::Generic,
156 _ => unimplemented!(),
157 }
158 }
159}
160
161impl From<&Error> for c_int {
162 fn from(value: &Error) -> Self {
163 match value {
164 Error::EventQueueFull => libmpv_client_sys::mpv_error_MPV_ERROR_EVENT_QUEUE_FULL,
165 Error::NoMemory => libmpv_client_sys::mpv_error_MPV_ERROR_NOMEM,
166 Error::Uninitialized => libmpv_client_sys::mpv_error_MPV_ERROR_UNINITIALIZED,
167 Error::InvalidParameter => libmpv_client_sys::mpv_error_MPV_ERROR_INVALID_PARAMETER,
168 Error::OptionNotFound => libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_NOT_FOUND,
169 Error::OptionFormat => libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_FORMAT,
170 Error::OptionError => libmpv_client_sys::mpv_error_MPV_ERROR_OPTION_ERROR,
171 Error::PropertyNotFound => libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_NOT_FOUND,
172 Error::PropertyFormat => libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_FORMAT,
173 Error::PropertyUnavailable => libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_UNAVAILABLE,
174 Error::PropertyError => libmpv_client_sys::mpv_error_MPV_ERROR_PROPERTY_ERROR,
175 Error::Command => libmpv_client_sys::mpv_error_MPV_ERROR_COMMAND,
176 Error::LoadingFailed => libmpv_client_sys::mpv_error_MPV_ERROR_LOADING_FAILED,
177 Error::AoInitFailed => libmpv_client_sys::mpv_error_MPV_ERROR_AO_INIT_FAILED,
178 Error::VoInitFailed => libmpv_client_sys::mpv_error_MPV_ERROR_VO_INIT_FAILED,
179 Error::NothingToPlay => libmpv_client_sys::mpv_error_MPV_ERROR_NOTHING_TO_PLAY,
180 Error::UnknownFormat => libmpv_client_sys::mpv_error_MPV_ERROR_UNKNOWN_FORMAT,
181 Error::Unsupported => libmpv_client_sys::mpv_error_MPV_ERROR_UNSUPPORTED,
182 Error::NotImplemented => libmpv_client_sys::mpv_error_MPV_ERROR_NOT_IMPLEMENTED,
183 Error::Generic => libmpv_client_sys::mpv_error_MPV_ERROR_GENERIC,
184 Error::Rust(_) => libmpv_client_sys::mpv_error_MPV_ERROR_GENERIC,
185 Error::Success(x) => *x as c_int,
186 }
187 }
188}