use clap::{CommandFactory, Parser, Subcommand};
use clap_mangen::Man;
use std::fs;
use std::path::PathBuf;
const LONG_ABOUT: &str = "\
A powerful command-line interface for converting, extracting, and processing \
documents using the Datalab API.
All commands output JSON to stdout for easy integration with scripts and agents. \
Progress events are streamed to stderr as JSON when running interactively.
GETTING STARTED:
1. Get your API key from https://www.datalab.to/app/keys
2. Export it: export DATALAB_API_KEY=\"your-key\"
3. Convert a document: datalab convert document.pdf
For detailed documentation, visit: https://documentation.datalab.to/";
const AFTER_HELP: &str = "\
ENVIRONMENT VARIABLES:
DATALAB_API_KEY API key for authentication (required)
DATALAB_BASE_URL Custom API endpoint for on-premises deployments
NO_COLOR Disable colored output when set
EXAMPLES:
datalab convert invoice.pdf
datalab extract contract.pdf --schema schema.json
datalab fill form.pdf --fields '{\"name\": \"John\"}'
For more examples, see: https://documentation.datalab.to/docs/welcome/quickstart";
#[derive(Parser)]
#[command(
name = "datalab",
author = "Datalab <support@datalab.to>",
version = env!("CARGO_PKG_VERSION"),
about = "CLI for the Datalab document processing API",
long_about = LONG_ABOUT,
after_help = AFTER_HELP,
)]
struct Cli {
#[arg(short, long, global = true)]
quiet: bool,
#[arg(short, long, global = true)]
verbose: bool,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Convert {
input: String,
#[arg(long, default_value = "markdown")]
output_format: String,
},
Extract {
input: String,
#[arg(long)]
schema: String,
},
Segment {
input: String,
#[arg(long)]
schema: String,
},
Fill {
input: String,
#[arg(long)]
fields: String,
},
TrackChanges {
input: String,
},
CreateDocument {
#[arg(long)]
markdown: String,
},
ExtractScore {
#[arg(long)]
checkpoint_id: String,
},
Files {
#[command(subcommand)]
command: FilesCommand,
},
Workflows {
#[command(subcommand)]
command: WorkflowsCommand,
},
Cache {
#[command(subcommand)]
command: CacheCommand,
},
}
#[derive(Subcommand)]
enum FilesCommand {
Upload { file: PathBuf },
List,
Get { file_id: String },
Download { file_id: String },
Delete { file_id: String },
}
#[derive(Subcommand)]
enum WorkflowsCommand {
Create {
#[arg(long)]
name: String,
#[arg(long)]
steps: PathBuf,
},
List,
Get { workflow_id: String },
Execute {
workflow_id: String,
#[arg(long)]
input: PathBuf,
},
Execution { execution_id: String },
Delete { workflow_id: String },
StepTypes,
}
#[derive(Subcommand)]
enum CacheCommand {
Clear {
#[arg(long)]
older_than: Option<u64>,
},
Stats,
}
fn main() -> std::io::Result<()> {
let out_dir = PathBuf::from(std::env::var_os("OUT_DIR").unwrap_or_else(|| "target/man".into()));
let man_dir = out_dir.join("man");
fs::create_dir_all(&man_dir)?;
let cmd = Cli::command();
let man = Man::new(cmd.clone());
let mut buffer = Vec::new();
man.render(&mut buffer)?;
fs::write(man_dir.join("datalab.1"), buffer)?;
for subcommand in cmd.get_subcommands() {
let name = subcommand.get_name();
let man = Man::new(subcommand.clone());
let mut buffer = Vec::new();
man.render(&mut buffer)?;
fs::write(man_dir.join(format!("datalab-{}.1", name)), buffer)?;
}
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-changed=src/main.rs");
Ok(())
}