From 7c64d57eb55376419cbec94b9a3bf6f2def7417c Mon Sep 17 00:00:00 2001
From: lilly
Date: Sun, 19 Jul 2026 20:47:27 +0200
Subject: [PATCH] implement wait feature in ssh-cli
---
ssh-cli/Cargo.lock | 67 +++++++++++++++++++++++----------------
ssh-cli/Cargo.toml | 2 +-
ssh-cli/src/api_models.rs | 6 ++--
ssh-cli/src/main.rs | 52 ++++++++++++++++++++++--------
4 files changed, 82 insertions(+), 45 deletions(-)
diff --git a/ssh-cli/Cargo.lock b/ssh-cli/Cargo.lock
index 1ccaee5..d30972c 100644
--- a/ssh-cli/Cargo.lock
+++ b/ssh-cli/Cargo.lock
@@ -152,7 +152,7 @@ checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -562,7 +562,7 @@ dependencies = [
"quote",
"rustc_version",
"simd_cesu8",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -581,7 +581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
dependencies = [
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -708,9 +708,9 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.106"
+version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
@@ -774,9 +774,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.46"
+version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
@@ -1012,9 +1012,9 @@ checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
[[package]]
name = "serde"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
"serde_derive",
@@ -1022,22 +1022,22 @@ dependencies = [
[[package]]
name = "serde_core"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.228"
+version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 3.0.0",
]
[[package]]
@@ -1152,6 +1152,17 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "syn"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2fac314a64dc9a36e61a9eb4261a5e9bbfbc922b27e518af97bc32b926cf967"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
[[package]]
name = "sync_wrapper"
version = "1.0.2"
@@ -1169,7 +1180,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -1195,22 +1206,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.18"
+version = "2.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+checksum = "09a43598840e33d5b0331f38c5e30d13bb11c11210a4b58f0d9b18a5a5eefcd9"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.18"
+version = "2.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+checksum = "43cbfe0cf76104d42a574802844187e84a305e531ed54455f11fbde0f10541cd"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 3.0.0",
]
[[package]]
@@ -1264,13 +1275,13 @@ dependencies = [
[[package]]
name = "tokio-macros"
-version = "2.7.0"
+version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
+checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -1360,7 +1371,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
@@ -1507,7 +1518,7 @@ dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
"wasm-bindgen-shared",
]
@@ -1700,7 +1711,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
"synstructure",
]
@@ -1721,7 +1732,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
"synstructure",
]
@@ -1761,7 +1772,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
dependencies = [
"proc-macro2",
"quote",
- "syn",
+ "syn 2.0.119",
]
[[package]]
diff --git a/ssh-cli/Cargo.toml b/ssh-cli/Cargo.toml
index 8c6edfc..8e1b446 100644
--- a/ssh-cli/Cargo.toml
+++ b/ssh-cli/Cargo.toml
@@ -8,6 +8,6 @@ eyre = "0.6.12"
reqwest = { version = "0.13.4", features = ["json"] }
serde = { version = "1.0.228", features = ["derive"] }
simple-eyre = "0.3.1"
-tokio = { version = "1.53.0", features = ["macros", "rt"] }
+tokio = { version = "1.53.0", features = ["macros", "rt", "time"] }
tracing = "0.1.44"
tracing-subscriber = "0.3.23"
diff --git a/ssh-cli/src/api_models.rs b/ssh-cli/src/api_models.rs
index b7ad45d..95c2a70 100644
--- a/ssh-cli/src/api_models.rs
+++ b/ssh-cli/src/api_models.rs
@@ -15,9 +15,9 @@ pub struct ApiLockStatus {
#[serde(default)]
pub is_low_batteray: bool,
pub is_error_jammed: bool,
- pub lock_target_level: String,
- pub lock_state: String,
- pub activity_state: String,
+ pub lock_target_level: LockTargetLevel,
+ pub lock_state: LockState,
+ pub activity_state: LockActivityState,
}
#[allow(unused)]
diff --git a/ssh-cli/src/main.rs b/ssh-cli/src/main.rs
index b4690ee..b76b2a0 100644
--- a/ssh-cli/src/main.rs
+++ b/ssh-cli/src/main.rs
@@ -13,13 +13,13 @@ mod api_client;
mod api_models;
mod cli;
-use std::process::exit;
+use std::{process::exit, time::Duration};
use eyre::eyre;
use crate::{
api_client::ApiClient,
- api_models::{ApiLock, DesiredLockState},
+ api_models::{ApiLock, DesiredLockState, LockState},
};
#[tokio::main(flavor = "current_thread")]
@@ -71,9 +71,10 @@ async fn main() -> eyre::Result<()> {
api.operate_lock(&lock.id, DesiredLockState::CLOSED).await?;
if wait_until_done {
- tracing::warn!(
- "wait feature is not yet implemented. lock should be turning now >~<"
- );
+ wait_for_lock_state(&api, &lock_name, LockState::LOCKED).await?;
+ println!("Lock is now closed. Enjoy <3");
+ } else {
+ println!("Lock is now closing. Enjoy <3");
}
exit(0);
@@ -89,9 +90,10 @@ async fn main() -> eyre::Result<()> {
api.operate_lock(&lock.id, DesiredLockState::OPEN).await?;
if wait_until_done {
- tracing::warn!(
- "wait feature is not yet implemented. lock should be turning now >~<"
- );
+ wait_for_lock_state(&api, &lock_name, LockState::UNLOCKED).await?;
+ println!("Lock is now opened. Enjoy <3");
+ } else {
+ println!("Lock is now opening. Enjoy <3");
}
exit(0);
@@ -111,9 +113,9 @@ async fn main() -> eyre::Result<()> {
if i_lock.status.is_error_jammed {
println!(" !!! Lock is jammed !!!");
}
- println!(" State: {}", i_lock.status.lock_state);
- println!(" Desired State: {}", i_lock.status.lock_target_level);
- println!(" Acitivty: {}", i_lock.status.activity_state);
+ println!(" State: {:?}", i_lock.status.lock_state);
+ println!(" Desired State: {:?}", i_lock.status.lock_target_level);
+ println!(" Acitivty: {:?}", i_lock.status.activity_state);
println!();
}
@@ -124,13 +126,37 @@ async fn main() -> eyre::Result<()> {
async fn find_lock(api: &ApiClient, name: &str) -> eyre::Result {
let locks = api.fetch_locks().await?;
- tracing::debug!("Comparing locks from API for one with name {name:?}");
+ tracing::trace!("Comparing locks from API for one with name {name:?}");
let lock = locks
.into_iter()
.find(|i_lock| i_lock.name.eq_ignore_ascii_case(&name))
.ok_or_else(|| {
eyre!("No lock named {name:?} exists. See \"list-locks\" for a list of valid locks.")
})?;
- tracing::debug!(lock = ?lock,"Identified lock with name matching {name:?}");
+ tracing::trace!(lock = ?lock, "Identified lock with name matching {name:?}");
Ok(lock)
}
+
+async fn wait_for_lock_state(
+ api: &ApiClient,
+ lock_name: &str,
+ desired_state: LockState,
+) -> eyre::Result<()> {
+ tokio::time::sleep(Duration::from_millis(200)).await;
+ let lock = find_lock(&api, &lock_name).await?;
+ let mut interval = tokio::time::interval(Duration::from_millis(500));
+ let mut last_status = lock.status;
+ while last_status.lock_state != desired_state {
+ interval.tick().await;
+ let lock = find_lock(&api, &lock_name).await?;
+ if lock.status != last_status {
+ println!(
+ "Lock state changed to {:?} (activity={:?})",
+ lock.status.lock_state, lock.status.activity_state
+ );
+ last_status = lock.status;
+ }
+ }
+
+ Ok(())
+}