1pub mod browse;
2pub mod link_state;
3
4use cp_ast_core::sample::{generate, sample_to_text};
5use std::path::Path;
6use thiserror::Error;
7
8pub const EDITOR_URL: &str = "https://manabeai.github.io/cp-ast-ecosystems/";
9
10#[derive(Debug, Error)]
11pub enum RtError {
12 #[error(transparent)]
13 Link(#[from] link_state::LinkStateError),
14 #[error(transparent)]
15 Ast(#[from] cp_ast_json::ConversionError),
16 #[error("failed to generate sample: {0}")]
17 Sample(#[from] cp_ast_core::sample::GenerationError),
18 #[error("failed to read input file {path}: {source}")]
19 ReadInputFile {
20 path: String,
21 source: std::io::Error,
22 },
23}
24
25pub fn generate_sample_text(input: &str, seed: Option<u64>) -> Result<(u64, String), RtError> {
26 let resolved_input = resolve_input(input)?;
27 let state = link_state::extract_state(&resolved_input)?;
28 let engine = cp_ast_json::deserialize_share_state(&state)?;
29 let seed = seed.unwrap_or_else(rand::random::<u64>);
30 let sample = generate(&engine, seed)?;
31 Ok((seed, sample_to_text(&engine, &sample)))
32}
33
34fn resolve_input(input: &str) -> Result<String, RtError> {
35 let candidate = input.trim();
36 if candidate.is_empty() {
37 return Ok(String::new());
38 }
39 let path = Path::new(candidate);
40 if path.is_file() {
41 let contents = std::fs::read_to_string(path).map_err(|source| RtError::ReadInputFile {
42 path: candidate.to_owned(),
43 source,
44 })?;
45 Ok(contents.trim().to_owned())
46 } else {
47 Ok(candidate.to_owned())
48 }
49}