commit 4a35f84694bcddd107f038405ab1037d329fdae4
parent 5e553bf4767108d59ae9f6b350b10e70f6381953
Author: triesap <triesap@radroots.dev>
Date: Thu, 22 Jan 2026 16:15:19 +0000
app: add setup step model
- define setup step enum with default/next helpers
- expose setup step model from app crate
- add unit tests for setup step transitions
- keep setup state helpers unchanged for later UI use
Diffstat:
2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/app/src/lib.rs b/app/src/lib.rs
@@ -105,7 +105,13 @@ pub use logging::{
APP_LOG_MAX_ENTRIES,
};
pub use notifications::{RadrootsAppNotifications, RadrootsAppNotificationsError, RadrootsAppNotificationsResult};
-pub use setup::{app_setup_eula_date, app_setup_initialize, app_setup_state_new};
+pub use setup::{
+ app_setup_eula_date,
+ app_setup_initialize,
+ app_setup_state_new,
+ app_setup_step_default,
+ RadrootsAppSetupStep,
+};
pub use tangle::{RadrootsAppTangleClient, RadrootsAppTangleClientStub, RadrootsAppTangleError, RadrootsAppTangleResult};
pub use config::{
app_config_default,
diff --git a/app/src/setup.rs b/app/src/setup.rs
@@ -42,6 +42,29 @@ pub fn app_setup_state_new(active_key: String, eula_date: String) -> RadrootsApp
}
}
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum RadrootsAppSetupStep {
+ Intro,
+ KeyChoice,
+}
+
+impl RadrootsAppSetupStep {
+ pub const fn next(self) -> Self {
+ match self {
+ RadrootsAppSetupStep::Intro => RadrootsAppSetupStep::KeyChoice,
+ RadrootsAppSetupStep::KeyChoice => RadrootsAppSetupStep::KeyChoice,
+ }
+ }
+
+ pub const fn is_terminal(self) -> bool {
+ matches!(self, RadrootsAppSetupStep::KeyChoice)
+ }
+}
+
+pub const fn app_setup_step_default() -> RadrootsAppSetupStep {
+ RadrootsAppSetupStep::Intro
+}
+
pub async fn app_setup_initialize<T: RadrootsClientDatastore, K: RadrootsClientKeystoreNostr>(
datastore: &T,
keystore: &K,
@@ -65,7 +88,13 @@ pub async fn app_setup_initialize<T: RadrootsClientDatastore, K: RadrootsClientK
#[cfg(test)]
mod tests {
- use super::{app_setup_eula_date, app_setup_initialize, app_setup_state_new};
+ use super::{
+ app_setup_eula_date,
+ app_setup_initialize,
+ app_setup_state_new,
+ app_setup_step_default,
+ RadrootsAppSetupStep,
+ };
use crate::{app_datastore_key_nostr_key, app_key_maps_default, RadrootsAppRole, RadrootsAppStateRecord};
use async_trait::async_trait;
use radroots_app_core::backup::RadrootsClientBackupDatastorePayload;
@@ -271,6 +300,29 @@ mod tests {
}
#[test]
+ fn setup_step_default_is_intro() {
+ assert_eq!(app_setup_step_default(), RadrootsAppSetupStep::Intro);
+ }
+
+ #[test]
+ fn setup_step_next_advances_once() {
+ assert_eq!(
+ RadrootsAppSetupStep::Intro.next(),
+ RadrootsAppSetupStep::KeyChoice
+ );
+ assert_eq!(
+ RadrootsAppSetupStep::KeyChoice.next(),
+ RadrootsAppSetupStep::KeyChoice
+ );
+ }
+
+ #[test]
+ fn setup_step_terminal_matches_key_choice() {
+ assert!(!RadrootsAppSetupStep::Intro.is_terminal());
+ assert!(RadrootsAppSetupStep::KeyChoice.is_terminal());
+ }
+
+ #[test]
fn setup_initialize_creates_state_and_key() {
let datastore = TestDatastore {
record: RefCell::new(None),