app

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

commit 6910ec87dce480055e0dae1574d075f0ede4ab25
parent 9526bd48f30c5b3da3d739c8a4b8296a91f9b791
Author: triesap <triesap@radroots.dev>
Date:   Mon, 19 Jan 2026 00:57:18 +0000

app-core: add radroots client types

- define radroots account request and activation structs
- add media resource and image upload payload types
- introduce async radroots client trait with API methods
- add unit test covering media resource fields

Diffstat:
Mcrates/core/src/radroots/mod.rs | 10++++++++++
Acrates/core/src/radroots/types.rs | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 84 insertions(+), 0 deletions(-)

diff --git a/crates/core/src/radroots/mod.rs b/crates/core/src/radroots/mod.rs @@ -1,3 +1,13 @@ pub mod error; +pub mod types; pub use error::{RadrootsClientRadrootsError, RadrootsClientRadrootsErrorMessage}; +pub use types::{ + RadrootsClientMediaImageUpload, + RadrootsClientMediaResource, + RadrootsClientRadroots, + RadrootsClientRadrootsAccountsActivate, + RadrootsClientRadrootsAccountsCreate, + RadrootsClientRadrootsAccountsRequest, + RadrootsClientRadrootsResult, +}; diff --git a/crates/core/src/radroots/types.rs b/crates/core/src/radroots/types.rs @@ -0,0 +1,74 @@ +use async_trait::async_trait; + +use super::RadrootsClientRadrootsError; + +pub type RadrootsClientRadrootsResult<T> = Result<T, RadrootsClientRadrootsError>; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RadrootsClientRadrootsAccountsRequest { + pub profile_name: String, + pub secret_key: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RadrootsClientRadrootsAccountsCreate { + pub tok: String, + pub secret_key: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RadrootsClientRadrootsAccountsActivate { + pub id: String, + pub secret_key: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RadrootsClientMediaResource { + pub base_url: String, + pub hash: String, + pub ext: String, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RadrootsClientMediaImageUpload { + pub mime_type: Option<String>, + pub file_data: Vec<u8>, + pub secret_key: String, +} + +#[async_trait(?Send)] +pub trait RadrootsClientRadroots { + async fn accounts_request( + &self, + opts: RadrootsClientRadrootsAccountsRequest, + ) -> RadrootsClientRadrootsResult<String>; + async fn accounts_create( + &self, + opts: RadrootsClientRadrootsAccountsCreate, + ) -> RadrootsClientRadrootsResult<String>; + async fn accounts_activate( + &self, + opts: RadrootsClientRadrootsAccountsActivate, + ) -> RadrootsClientRadrootsResult<String>; + async fn media_image_upload( + &self, + opts: RadrootsClientMediaImageUpload, + ) -> RadrootsClientRadrootsResult<RadrootsClientMediaResource>; +} + +#[cfg(test)] +mod tests { + use super::RadrootsClientMediaResource; + + #[test] + fn media_resource_fields_roundtrip() { + let resource = RadrootsClientMediaResource { + base_url: String::from("https://example.com"), + hash: String::from("hash"), + ext: String::from("png"), + }; + assert_eq!(resource.base_url, "https://example.com"); + assert_eq!(resource.hash, "hash"); + assert_eq!(resource.ext, "png"); + } +}