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}