use clap::{Parser, Subcommand};
use sure_client_rs::SureClient;
use sure_client_rs::models::auth::{DeviceInfo, RefreshDeviceInfo, SignupUserData};
use url::Url;
use uuid::Uuid;
#[derive(Parser)]
#[command(name = "auth")]
#[command(about = "Authentication operations via the Sure API", long_about = None)]
struct Cli {
#[arg(long, env = "SURE_BASE_URL", default_value = "http://localhost:3000")]
base_url: Url,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Signup {
#[arg(long)]
email: String,
#[arg(long)]
password: String,
#[arg(long)]
first_name: String,
#[arg(long)]
last_name: String,
},
Login {
#[arg(long)]
email: String,
#[arg(long)]
password: String,
},
Refresh {
#[arg(long)]
refresh_token: String,
},
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
let client = SureClient::new(
reqwest::Client::new(),
sure_client_rs::Auth::api_key("unused"),
cli.base_url,
);
match cli.command {
Commands::Signup {
email,
password,
first_name,
last_name,
} => {
let device = DeviceInfo {
device_id: format!("cli-{}", uuid::Uuid::new_v4()),
device_name: "Claude CLI".to_string(),
device_type: "cli".to_string(),
os_version: std::env::consts::OS.to_string(),
app_version: env!("CARGO_PKG_VERSION").to_string(),
};
let response = client
.signup()
.user(SignupUserData {
email,
password,
first_name,
last_name,
})
.device(device)
.call()
.await?;
println!("Signup successful!");
println!();
println!("Access Token: {}", response.access_token);
println!("Refresh Token: {}", response.refresh_token);
println!("Token Type: {:?}", response.token_type);
println!("Expires In: {} seconds", response.expires_in.as_secs());
println!();
println!("User Info:");
println!(" ID: {}", response.user.id);
println!(" Email: {}", response.user.email);
println!(" First Name: {}", response.user.first_name);
println!(" Last Name: {}", response.user.last_name);
}
Commands::Login { email, password } => {
let device = DeviceInfo {
device_id: format!("cli-{}", Uuid::new_v4()),
device_name: "Claude CLI".to_string(),
device_type: "cli".to_string(),
os_version: std::env::consts::OS.to_string(),
app_version: env!("CARGO_PKG_VERSION").to_string(),
};
let response = client
.login()
.email(email)
.password(password)
.device(device)
.call()
.await?;
println!("Login successful!");
println!();
println!("Access Token: {}", response.access_token);
println!("Refresh Token: {}", response.refresh_token);
println!("Token Type: {:?}", response.token_type);
println!("Expires In: {} seconds", response.expires_in.as_secs());
println!();
println!("User Info:");
println!(" ID: {}", response.user.id);
println!(" Email: {}", response.user.email);
println!(" First Name: {}", response.user.first_name);
println!(" Last Name: {}", response.user.last_name);
}
Commands::Refresh { refresh_token } => {
let device = RefreshDeviceInfo {
device_id: format!("cli-{}", Uuid::new_v4()),
};
let response = client
.refresh_token()
.refresh_token(refresh_token)
.device(device)
.call()
.await?;
println!("Token refresh successful!");
println!();
println!("Access Token: {}", response.access_token);
println!("Refresh Token: {}", response.refresh_token);
println!("Token Type: {:?}", response.token_type);
println!("Expires In: {} seconds", response.expires_in.as_secs());
}
}
Ok(())
}