slave 0.13.1

CLI for slave, a Laravel-inspired Rust framework for MCP-first apps: scaffold an MCP backend with auth, roles, teams and SurrealDB migrations, add server-rendered web apps, and route them by domain or path
//! `slave` — the command-line companion for the slave web framework.

mod apps;
mod cargo;
mod cli;
mod commands;
mod generator;
mod naming;
mod project;
mod runtime;
mod session;
mod templates;
mod timestamp;

use std::process::ExitCode;

use clap::Parser;

use crate::cli::{Cli, Command};
use crate::commands::make::Artifact;
use crate::commands::migrate::Action;

/// `--url`, or the backend of the project in the current directory.
fn project_url(url: Option<String>) -> anyhow::Result<String> {
    match url {
        Some(url) => Ok(url),
        None => session::project_url(&project::find_root()?),
    }
}

/// `slave login`: inside a project, also remembers it for `make:app` run
/// elsewhere.
fn login(url: Option<String>) -> anyhow::Result<()> {
    match url {
        Some(url) => session::login(&url),
        None => {
            let root = project::find_root()?;
            session::login(&session::project_url(&root)?)?;
            session::remember_project(&root)
        }
    }
}

fn main() -> ExitCode {
    let cli = Cli::parse();

    let result = match cli.command {
        Command::New(args) => commands::new::run(&args),
        Command::MakeModel(args) => commands::make::run(Artifact::Model, &args),
        Command::MakeTools(args) => commands::make::run(Artifact::Tools, &args),
        Command::MakeApp(args) => commands::make_app::run(&args),
        Command::MakeMigration { name } => commands::migrate::run(Action::Generate { name: &name }),
        Command::Migrate => commands::migrate::run(Action::Apply),
        Command::MigrateStatus => commands::migrate::run(Action::Status),
        Command::MigrateFresh { force } => commands::migrate::run(Action::Reset { force }),
        Command::InstallFly(args) => commands::fly::install(&args),
        Command::DeployFly(args) => commands::fly::deploy(&args),
        Command::Build(args) => commands::build::run(&args),
        Command::RouteList => commands::route::list(),
        Command::RouteMatch { target } => commands::route::matches(&target),
        Command::Serve(args) => commands::serve::run(&args),
        Command::Login { url } => login(url),
        Command::Logout { url } => project_url(url).and_then(|url| session::logout(&url)),
        Command::Doctor => commands::doctor::run(),
        Command::AppSeparate { name } => commands::app::separate(&name),
        Command::AppEmbed { name } => commands::app::embed(&name),
    };

    match result {
        Ok(()) => ExitCode::SUCCESS,
        Err(err) => {
            eprintln!("error: {err:#}");
            ExitCode::FAILURE
        }
    }
}