schemaui_cli/session/
builder.rs1use 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}