Skip to main content

random_test_cli/
lib.rs

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}