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 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 }
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 }
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}