two.rs
1.8 kB · rust · 71 lines
1use crate::{code_of, Fault, Grid, Pixels};2use mrlycore::cell::mapping;3use mrlycore::{json, Mode};4use mrlymath::two::{self, Cell2d};5use wasm_bindgen::prelude::*;67fn cell(8 code: &str,9 number: usize,10 level: usize,11 rotation: usize,12 base: usize,13) -> Result<Cell2d, Fault> {14 Ok(two::create(code_of(code)?, number, level, rotation, base)?)15}1617/// Builds the flat design the code names as a byte grid, one byte per site.18#[wasm_bindgen]19pub fn two_grid(20 code: &str,21 number: usize,22 level: usize,23 rotation: usize,24 base: usize,25) -> Result<Grid, Fault> {26 let cell = cell(code, number, level, rotation, base)?;27 Ok(Grid {28 width: cell.width() as u32,29 height: cell.height() as u32,30 types: cell.types().bytes().to_vec(),31 })32}3334/// Paints the flat design the code names: filled sites black, empty sites white.35#[wasm_bindgen]36pub fn two_pixels(37 code: &str,38 number: usize,39 level: usize,40 rotation: usize,41 base: usize,42) -> Result<Pixels, Fault> {43 let cell = cell(code, number, level, rotation, base)?.paint(&mapping(), Mode::Type);44 let (width, height) = (cell.width(), cell.height());45 Ok(Pixels::of(46 width,47 height,48 cell.cell.colors.unwrap_or_default(),49 ))50}5152/// Tallies the flat design: fills, voids, perimeter, vertices, edges and Euler number, as JSON.53#[wasm_bindgen]54pub fn two_census(55 code: &str,56 number: usize,57 level: usize,58 rotation: usize,59 base: usize,60) -> Result<String, Fault> {61 let tally = two::census(&cell(code, number, level, rotation, base)?)?;62 Ok(json!({63 "fills": tally.fills,64 "voids": tally.voids,65 "perimeter": tally.perimeter.to_string(),66 "vertices": tally.vertices,67 "edges": tally.edges,68 "euler": tally.euler,69 })70 .to_string())71}