app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

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:
Mapp/src/lib.rs | 8+++++++-
Mapp/src/setup.rs | 54+++++++++++++++++++++++++++++++++++++++++++++++++++++-
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),