Merge pull request #75 from hamirmahal/refactor/replace-get-0-with-first

refactor: replace `get(0)` with cleaner `first()`
This commit is contained in:
Salem Yaslem 2024-06-30 22:00:13 +03:00 committed by GitHub
commit 2bc71a8168
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,7 +5,7 @@ use zbus::{
dbus_proxy, dbus_proxy,
export::futures_util::TryStreamExt, export::futures_util::TryStreamExt,
zvariant::{ObjectPath, OwnedObjectPath, Structure, Value}, zvariant::{ObjectPath, OwnedObjectPath, Structure, Value},
Connection, MessageStream, MessageType, Result Connection, MessageStream, MessageType, Result,
}; };
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
@ -20,7 +20,7 @@ pub enum RecordTypes {
pub enum CursorModeTypes { pub enum CursorModeTypes {
Default, Default,
Hidden, Hidden,
Show Show,
} }
#[dbus_proxy( #[dbus_proxy(
@ -54,8 +54,12 @@ pub struct WaylandRecorder {
impl WaylandRecorder { impl WaylandRecorder {
pub async fn new() -> Self { pub async fn new() -> Self {
let connection = Connection::session().await.expect("failed to connect to session bus"); let connection = Connection::session()
let screen_cast_proxy = ScreenCastProxy::new(&connection).await.expect("failed to create dbus proxy for screen-cast"); .await
.expect("failed to connect to session bus");
let screen_cast_proxy = ScreenCastProxy::new(&connection)
.await
.expect("failed to create dbus proxy for screen-cast");
gst::init().expect("failed to initialize gstreamer"); gst::init().expect("failed to initialize gstreamer");
WaylandRecorder { WaylandRecorder {
@ -67,24 +71,37 @@ impl WaylandRecorder {
} }
} }
pub async fn start(&mut self, filename: String, record_type: RecordTypes, cursor_mode_type: CursorModeTypes) -> bool { pub async fn start(
self.screen_cast_proxy.create_session(HashMap::from([ &mut self,
("handle_token", Value::from("blue_recorder_1")), filename: String,
("session_handle_token", Value::from("blue_recorder_1")), record_type: RecordTypes,
])) cursor_mode_type: CursorModeTypes,
.await.expect("failed to create session"); ) -> bool {
self.screen_cast_proxy
.create_session(HashMap::from([
("handle_token", Value::from("blue_recorder_1")),
("session_handle_token", Value::from("blue_recorder_1")),
]))
.await
.expect("failed to create session");
let mut message_stream = MessageStream::from(self.connection.clone()); let mut message_stream = MessageStream::from(self.connection.clone());
self.filename = filename.clone(); self.filename = filename.clone();
while let Some(msg) = message_stream.try_next().await.expect("failed to get message") { while let Some(msg) = message_stream
.try_next()
.await
.expect("failed to get message")
{
match msg.message_type() { match msg.message_type() {
MessageType::Signal => { MessageType::Signal => {
let (response_num, response) = msg.body::<(u32, HashMap<&str, Value>)>().expect("failed to get body"); let (response_num, response) = msg
.body::<(u32, HashMap<&str, Value>)>()
.expect("failed to get body");
if response_num > 0 { if response_num > 0 {
return false; return false;
} }
if response.len() == 0 { if response.len() == 0 {
@ -96,14 +113,17 @@ impl WaylandRecorder {
self.screen_cast_proxy.clone(), self.screen_cast_proxy.clone(),
response.clone(), response.clone(),
record_type, record_type,
cursor_mode_type cursor_mode_type,
) )
.await.expect("failed to handle session"); .await
.expect("failed to handle session");
continue; continue;
} }
if response.contains_key("streams") { if response.contains_key("streams") {
self.record_screen_cast(response.clone()).await.expect("failed to record screen cast"); self.record_screen_cast(response.clone())
.await
.expect("failed to record screen cast");
break; break;
} }
} }
@ -124,8 +144,21 @@ impl WaylandRecorder {
} }
if self.session_path.len() > 0 { if self.session_path.len() > 0 {
println!("Closing session...: {:?}", self.session_path.replace("request", "session")); println!(
self.connection.clone().call_method(Some("org.freedesktop.portal.Desktop"), self.session_path.clone().replace("request", "session"), Some("org.freedesktop.portal.Session"), "Close", &()).await.expect("failed to close session"); "Closing session...: {:?}",
self.session_path.replace("request", "session")
);
self.connection
.clone()
.call_method(
Some("org.freedesktop.portal.Desktop"),
self.session_path.clone().replace("request", "session"),
Some("org.freedesktop.portal.Session"),
"Close",
&(),
)
.await
.expect("failed to close session");
self.session_path = String::new(); self.session_path = String::new();
} }
} }
@ -135,7 +168,7 @@ impl WaylandRecorder {
screen_cast_proxy: ScreenCastProxy<'_>, screen_cast_proxy: ScreenCastProxy<'_>,
response: HashMap<&str, Value<'_>>, response: HashMap<&str, Value<'_>>,
record_type: RecordTypes, record_type: RecordTypes,
cursor_mode_type: CursorModeTypes cursor_mode_type: CursorModeTypes,
) -> Result<()> { ) -> Result<()> {
let response_session_handle = response let response_session_handle = response
.get("session_handle") .get("session_handle")
@ -191,13 +224,13 @@ impl WaylandRecorder {
.clone() .clone()
.downcast::<Vec<Value>>() .downcast::<Vec<Value>>()
.expect("cannot down cast streams to vec array") .expect("cannot down cast streams to vec array")
.get(0) .first()
.expect("cannot get first object from streams array") .expect("cannot get first object from streams array")
.clone() .clone()
.downcast::<Structure>() .downcast::<Structure>()
.expect("cannot down cast first object to structure") .expect("cannot down cast first object to structure")
.fields() .fields()
.get(0) .first()
.expect("cannot get first field from structure") .expect("cannot get first field from structure")
.clone() .clone()
.downcast::<u32>() .downcast::<u32>()