use semver::Version; use serde::{Deserialize, Serialize}; use std::borrow::Cow; use std::sync::LazyLock; use time::OffsetDateTime; // the usage of X- has been deprecated for quite along time, it turns out pub(crate) static ATUIN_HEADER_VERSION: &str = "Atuin-Version"; pub(crate) static ATUIN_CARGO_VERSION: &str = env!("CARGO_PKG_VERSION"); pub(crate) static ATUIN_VERSION: LazyLock = LazyLock::new(|| Version::parse(ATUIN_CARGO_VERSION).expect("failed to parse self semver")); #[derive(Debug, Serialize, Deserialize)] pub(crate) struct UserResponse { pub(crate) username: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct RegisterRequest { pub(crate) email: String, pub(crate) username: String, pub(crate) password: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct RegisterResponse { pub(crate) session: String, /// Auth type: "hub" for Hub API tokens, "cli" for legacy CLI session tokens. /// Old servers that don't return this field will deserialize as None. #[serde(default)] pub(crate) auth: Option, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct DeleteUserResponse {} #[derive(Debug, Serialize, Deserialize)] pub(crate) struct ChangePasswordRequest { pub(crate) current_password: String, pub(crate) new_password: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct ChangePasswordResponse {} #[derive(Debug, Serialize, Deserialize)] pub(crate) struct LoginRequest { pub(crate) username: String, pub(crate) password: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct LoginResponse { pub(crate) session: String, /// Auth type: "hub" for Hub API tokens, "cli" for legacy CLI session tokens. /// Old servers that don't return this field will deserialize as None. #[serde(default)] pub(crate) auth: Option, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct AddHistoryRequest { pub(crate) id: String, #[serde(with = "time::serde::rfc3339")] pub(crate) timestamp: OffsetDateTime, pub(crate) data: String, pub(crate) hostname: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct CountResponse { pub(crate) count: i64, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct SyncHistoryRequest { #[serde(with = "time::serde::rfc3339")] pub(crate) sync_ts: OffsetDateTime, #[serde(with = "time::serde::rfc3339")] pub(crate) history_ts: OffsetDateTime, pub(crate) host: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct SyncHistoryResponse { pub(crate) history: Vec, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct ErrorResponse<'a> { pub(crate) reason: Cow<'a, str>, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct IndexResponse { pub(crate) homage: String, pub(crate) version: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct StatusResponse { pub(crate) count: i64, pub(crate) username: String, pub(crate) deleted: Vec, // These could/should also go on the index of the server // However, we do not request the server index as a part of normal sync // I'd rather slightly increase the size of this response, than add an extra HTTP request pub(crate) page_size: i64, // max page size supported by the server pub(crate) version: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct DeleteHistoryRequest { pub(crate) client_id: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct MessageResponse { pub(crate) message: String, } #[derive(Debug, Serialize, Deserialize)] pub(crate) struct MeResponse { pub(crate) username: String, } // Hub CLI authentication types /// Response from POST /auth/cli/code - generates a code for CLI auth #[derive(Debug, Serialize, Deserialize)] pub(crate) struct CliCodeResponse { pub(crate) code: String, } /// Response from GET /auth/cli/verify?code= - polls for authorization #[derive(Debug, Serialize, Deserialize)] pub(crate) struct CliVerifyResponse { /// Session token, present only when authorization is complete pub(crate) token: Option, pub(crate) success: Option, pub(crate) error: Option, }