1use crate::ffi;
4use glib::{prelude::*, translate::*};
5use std::fmt;
6use std::ops;
7
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
10#[doc(alias = "GstRank")]
11pub struct Rank(i32);
12
13impl Rank {
14 #[doc(alias = "GST_RANK_NONE")]
15 pub const NONE: Rank = Self(ffi::GST_RANK_NONE);
16 #[doc(alias = "GST_RANK_MARGINAL")]
17 pub const MARGINAL: Rank = Self(ffi::GST_RANK_MARGINAL);
18 #[doc(alias = "GST_RANK_SECONDARY")]
19 pub const SECONDARY: Rank = Self(ffi::GST_RANK_SECONDARY);
20 #[doc(alias = "GST_RANK_PRIMARY")]
21 pub const PRIMARY: Rank = Self(ffi::GST_RANK_PRIMARY);
22}
23
24impl IntoGlib for Rank {
25 type GlibType = i32;
26
27 #[inline]
28 fn into_glib(self) -> i32 {
29 self.0
30 }
31}
32
33#[doc(hidden)]
34impl FromGlib<i32> for Rank {
35 #[inline]
36 unsafe fn from_glib(value: i32) -> Self {
37 Rank(value)
38 }
39}
40
41impl StaticType for Rank {
42 #[inline]
43 fn static_type() -> glib::Type {
44 unsafe { from_glib(ffi::gst_rank_get_type()) }
45 }
46}
47
48impl HasParamSpec for Rank {
49 type ParamSpec = glib::ParamSpecEnum;
50 type SetValue = Self;
51 type BuilderFn = fn(&str, Self) -> glib::ParamSpecEnumBuilder<Self>;
52
53 fn param_spec_builder() -> Self::BuilderFn {
54 Self::ParamSpec::builder_with_default
55 }
56}
57
58impl glib::value::ValueType for Rank {
59 type Type = Self;
60}
61
62unsafe impl<'a> glib::value::FromValue<'a> for Rank {
63 type Checker = glib::value::GenericValueTypeChecker<Self>;
64
65 #[inline]
66 unsafe fn from_value(value: &'a glib::Value) -> Self {
67 unsafe {
68 skip_assert_initialized!();
69 from_glib(glib::gobject_ffi::g_value_get_enum(value.to_glib_none().0))
70 }
71 }
72}
73
74impl ToValue for Rank {
75 #[inline]
76 fn to_value(&self) -> glib::Value {
77 let mut value = glib::Value::for_value_type::<Self>();
78 unsafe {
79 glib::gobject_ffi::g_value_set_enum(value.to_glib_none_mut().0, self.into_glib());
80 }
81 value
82 }
83
84 #[inline]
85 fn value_type(&self) -> glib::Type {
86 Self::static_type()
87 }
88}
89
90impl From<Rank> for glib::Value {
91 #[inline]
92 fn from(v: Rank) -> Self {
93 skip_assert_initialized!();
94 ToValue::to_value(&v)
95 }
96}
97
98impl From<i32> for Rank {
99 #[inline]
100 fn from(v: i32) -> Self {
101 skip_assert_initialized!();
102 Rank(v)
103 }
104}
105
106impl From<Rank> for i32 {
107 #[inline]
108 fn from(v: Rank) -> Self {
109 skip_assert_initialized!();
110 v.0
111 }
112}
113
114impl ops::Add<i32> for Rank {
115 type Output = Rank;
116
117 #[inline]
118 fn add(self, rhs: i32) -> Rank {
119 Rank(self.0 + rhs)
120 }
121}
122
123impl ops::Add<Rank> for i32 {
124 type Output = Rank;
125
126 #[inline]
127 fn add(self, rhs: Rank) -> Rank {
128 Rank(self + rhs.0)
129 }
130}
131
132impl ops::AddAssign<i32> for Rank {
133 #[inline]
134 fn add_assign(&mut self, rhs: i32) {
135 self.0 += rhs;
136 }
137}
138
139impl ops::Sub<i32> for Rank {
140 type Output = Rank;
141
142 #[inline]
143 fn sub(self, rhs: i32) -> Rank {
144 Rank(self.0 - rhs)
145 }
146}
147
148impl ops::Sub<Rank> for i32 {
149 type Output = Rank;
150
151 #[inline]
152 fn sub(self, rhs: Rank) -> Rank {
153 Rank(self - rhs.0)
154 }
155}
156
157impl ops::SubAssign<i32> for Rank {
158 #[inline]
159 fn sub_assign(&mut self, rhs: i32) {
160 self.0 -= rhs
161 }
162}
163
164impl std::cmp::PartialEq<i32> for Rank {
165 #[inline]
166 fn eq(&self, rhs: &i32) -> bool {
167 self.0 == *rhs
168 }
169}
170
171impl std::cmp::PartialEq<Rank> for i32 {
172 #[inline]
173 fn eq(&self, rhs: &Rank) -> bool {
174 *self == rhs.0
175 }
176}
177
178impl fmt::Display for Rank {
179 #[inline]
180 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
181 let rank = self.into_glib();
182 let names: [&str; 4] = ["none", "marginal", "secondary", "primary"];
183 let ranks: [Rank; 4] = [Rank::NONE, Rank::MARGINAL, Rank::SECONDARY, Rank::PRIMARY];
184
185 let mut best_i = 0;
186 for i in 0..4 {
187 if rank == ranks[i].into_glib() {
188 return f.write_str(names[i]);
189 }
190 if (rank - ranks[i]).into_glib().abs() < (rank - ranks[best_i]).into_glib().abs() {
191 best_i = i;
192 }
193 }
194
195 let diff = (rank - ranks[best_i]).into_glib();
196 let op_str = if diff > 0 { '+' } else { '-' };
197
198 write!(f, "{} {} {}", names[best_i], op_str, diff.abs())
199 }
200}