Skip to main content

schemaui_cli/session/
builder.rs

1use anyhow::{Result, anyhow};
2
3use crate::cli::CommonArgs;
4
5use super::bundle::SessionBundle;
6use super::diagnostics::DiagnosticCollector;
7use super::format::resolve_format_hint;
8use super::output::{build_output_options, ensure_output_paths_available};
9use super::schema_source::{load_optional_document, resolve_session_inputs};
10
11pub fn prepare_session(args: &CommonArgs) -> Result<SessionBundle> {
12    let mut diagnostics = DiagnosticCollector::default();
13
14    let schema_spec = args.schema.as_deref();
15    let config_spec = args.config.as_deref();
16    let schema_stdin = schema_spec == Some("-");
17    let config_stdin = config_spec == Some("-");
18    if schema_stdin && config_stdin {
19        diagnostics.push_input(
20            "schema/config",
21            "cannot read schema and config from stdin simultaneously; provide inline content or files",
22        );
23    }
24
25    let schema_hint = resolve_format_hint(schema_spec, "schema", &mut diagnostics);
26    let config_hint = resolve_format_hint(config_spec, "config", &mut diagnostics);
27
28    let schema_document = load_optional_document(
29        schema_spec,
30        schema_hint.hint.format,
31        "schema",
32        schema_hint.blocked || (schema_stdin && config_stdin),
33        &mut diagnostics,
34    );
35    let config_document = load_optional_document(
36        config_spec,
37        config_hint.hint.format,
38        "config",
39        config_hint.blocked || (schema_stdin && config_stdin),
40        &mut diagnostics,
41    );
42
43    let (output_settings, output_paths) = build_output_options(
44        args,
45        config_hint.hint.extension_value(),
46        schema_hint.hint.extension_value(),
47        &mut diagnostics,
48    );
49    ensure_output_paths_available(&output_paths, args.force, &mut diagnostics);
50
51    diagnostics.into_result()?;
52
53    if schema_document.is_none() && config_document.is_none() {
54        return Err(anyhow!("provide at least --schema or --config"));
55    }
56    let resolved = resolve_session_inputs(schema_document, config_document)?;
57
58    Ok(SessionBundle {
59        schema: resolved.schema,
60        defaults: resolved.defaults,
61        title: args.title.clone(),
62        description: args.description.clone(),
63        output: output_settings,
64    })
65}