mod shim;
use clap::Parser;
use shim::cli::{Cli, Commands};
fn main() {
let cli = Cli::parse();
match cli.command {
Commands::Mcp => {
shim::mcp::run();
}
Commands::Login { token } => {
let token = match token {
Some(t) => t,
None => {
eprintln!("Enter your FalseGreen key: ");
let mut input = String::new();
std::io::stdin()
.read_line(&mut input)
.expect("failed to read input");
input.trim().to_string()
}
};
if token.is_empty() {
eprintln!("Key cannot be empty.");
std::process::exit(1);
}
println!("Establishing an individual FalseGreen session...");
let device_id = match shim::config::load_or_create_device_id() {
Ok(device_id) => device_id,
Err(e) => {
eprintln!("Failed to establish a stable device identity: {}", e);
std::process::exit(1);
}
};
let principal_id = match shim::config::load_or_create_principal_id() {
Ok(principal_id) => principal_id,
Err(e) => {
eprintln!(
"Failed to establish an individual principal identity: {}",
e
);
std::process::exit(1);
}
};
match shim::device::login(&token, &device_id, &principal_id) {
Ok(session) => {
match shim::config::save_credentials(&session.access_token, &session.session_id)
{
Ok(_) => {
println!("Logged in.");
println!(
"Credentials stored in {:?}.",
shim::config::credentials_path()
);
}
Err(e) => {
eprintln!("Failed to store credentials: {}", e);
std::process::exit(1);
}
}
}
Err(e) => {
eprintln!("Login failed: {}", e);
std::process::exit(1);
}
}
}
Commands::Logout => {
if let Some(token) = shim::config::load_token() {
print!("Revoking session... ");
match shim::device::logout(&token) {
Ok(_) => println!("done."),
Err(e) => {
println!("failed: {}", e);
eprintln!("Local credentials were kept so logout can be retried.");
std::process::exit(1);
}
}
}
match shim::config::clear_token() {
Ok(_) => println!("Logged out."),
Err(e) => {
eprintln!("Failed to remove credentials: {}", e);
std::process::exit(1);
}
}
}
Commands::Status => {
match shim::config::load_token() {
Some(_) => {
println!(
"Authenticated. Key stored in {:?}.",
shim::config::credentials_path()
);
if let Some(id) = shim::config::load_session_id() {
println!("Session: {}", id);
}
}
None => println!("Not authenticated. Run `falsegreen login` to set up."),
}
println!("API endpoint: {}", shim::config::api_url());
}
Commands::Terraform { command } => match shim::iac::run(command) {
Ok(output) => println!("{output}"),
Err(error) => {
eprintln!("Terraform operation failed: {error}");
std::process::exit(1);
}
},
Commands::Install { agent } => match shim::install::install(&agent) {
Ok(_) => {}
Err(e) => {
eprintln!("Install failed: {}", e);
std::process::exit(1);
}
},
}
}