Skip to main content

fish_oxide/
lib.rs

1#![allow(dead_code, unused)]
2use clap::ValueEnum;
3use custom_rand::{seed_rand, str_to_seed};
4use draw::{cleanup, draw_svg, fish, reframe};
5use hershey::binomen;
6
7pub use crate::params::generate_params;
8pub use crate::params::Params;
9
10pub mod custom_rand;
11pub mod draw;
12pub mod geometry;
13pub mod hershey;
14pub mod params;
15
16#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
17pub enum Format {
18    Svg,
19    Json,
20    Smil,
21    Csv,
22    Ps,
23}
24
25pub fn generate(
26    format: Format,
27    seed: String,
28    caption: Option<String>,
29    _speed_opt: Option<f64>,
30    pad_opt: Option<f64>,
31    fish_opts: Option<params::Params>,
32) -> String {
33    seed_rand(str_to_seed(seed.to_owned()).into());
34
35    // let mut speed = 0.005 / speed_opt.unwrap_or(1.);
36    let drawing = fish(fish_opts.unwrap_or_else(generate_params));
37    let polylines = cleanup(reframe(drawing, pad_opt, Some(caption.unwrap_or(seed))));
38
39    match format {
40        Format::Svg => draw_svg(polylines),
41        Format::Json => serde_json::to_string(&polylines).unwrap(),
42        Format::Smil => {
43            todo!("Smil format is not yet supported")
44
45            // draw_svg_anim(polylines, speed)
46        }
47        Format::Csv => polylines
48            .iter()
49            .map(|x| {
50                x.iter()
51                    .map(|z| format!("{:?},{:?}", (*z).0, (*z).1))
52                    .collect::<Vec<String>>()
53                    .join(",")
54            })
55            .collect::<Vec<String>>()
56            .join("\n"),
57        Format::Ps => {
58            todo!("Ps format is not yet supported")
59            // draw_ps(polylines)
60        }
61    }
62}
63
64pub fn generate_svg() -> String {
65    let seed = binomen();
66    generate(Format::Svg, seed.clone(), Some(seed), None, Some(20.), None)
67}
68
69pub fn generate_json() -> String {
70    let seed = binomen();
71    generate(
72        Format::Json,
73        seed.clone(),
74        Some(seed),
75        None,
76        Some(20.),
77        None,
78    )
79}
80
81pub fn generate_csv() -> String {
82    let seed = binomen();
83    generate(Format::Csv, seed.clone(), Some(seed), None, Some(20.), None)
84}
85
86pub fn generate_raw() -> Vec<Vec<(f64, f64)>> {
87    let seed = binomen();
88    cleanup(reframe(fish(generate_params()), Some(20.), Some(seed)))
89}