记录rust踩坑之路

408 阅读2分钟

介于现在wasm这么火热的情况下本小白开始了rust的踩坑之路。
前端使用vite2+vue3+ts。
rust生成wasm与vue交互使用的vite-plugin-rsw插件:github.com/lencx/vite-…

直接上效果图:

be23d42df873f71b0b04299c7fac0a4.png

前方大量代码来袭:

mod get_dom;
mod link;

use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;




#[wasm_bindgen]
extern "C"{
    #[wasm_bindgen(js_namespace = console)]
    fn log(s: &str);
}



#[wasm_bindgen]
pub fn set_map(id: &str) -> Result<(), JsValue> {
    // 获取页面window
    let window = web_sys::window().expect("should have a window in this context");
    // 获取页面dom
    let document: web_sys::Document = window.document().expect("window should have a document");
    // 根据id获取容器
    let map: web_sys::Element = document.get_element_by_id(id).expect("document should have a id");
    /*
    * 创建canvas元素
    * create_element rust方法一般用下划线分隔
    * dyn_into 将类型进行转换
    */
    let canvas = document
        .create_element("canvas")?
        .dyn_into::<web_sys::HtmlCanvasElement>()?;
    // 获取容器宽度
    let width = map.client_width() as f64;
    // 获取容器高度
    let height = map.client_height() as f64;
    // 在容器内部添加canvas元素
    map.append_child(&canvas)?;
    // 设置canvas的宽度
    canvas.set_width(width as u32);
    // 设置canvas的高度
    canvas.set_height(height as u32);

    let ctx: web_sys::CanvasRenderingContext2d = canvas
        .get_context("2d")
        .unwrap()
        .unwrap().dyn_into::<web_sys::CanvasRenderingContext2d>().unwrap();

    ctx.set_fill_style(&JsValue::from("rgb(255,255,255)"));

    ctx.fill_rect(0.0, 0.0, width as f64, height as f64);
    ctx.stroke();


    // 地图数据json
    let link: serde_json::Value = serde_json::from_str(link::set_json()).unwrap();

    // 矩阵坐标x轴最大值
    let mut max_x = 0.00;
    // 矩阵坐标y轴最大值
    let mut min_x = 0.00;
    // 矩阵坐标x轴最小值
    let mut max_y = 0.00;
    // 矩阵坐标y轴最小值
    let mut min_y = 0.00;

    // 当前X轴原点处于Y轴位置
    let x = { height as f64 / 2 as f64 } as f64;
    // 当前Y轴原点处于X轴位置
    let y = { width as f64 / 2 as f64 } as f64;
    let dip = 10.00;

    // features边界线数据list
    for element in link["features"].as_array().unwrap() {
        // 坐标数据
        let coordinates = element["geometry"]["coordinates"].as_array().unwrap();
        for coordinate_element in coordinates {
            // log(&format!("{:?}", coordinate_element));
            let coordinate_list = coordinate_element.as_array().unwrap();
            // log(&format!("{:?}", coordinate_list));
            for coordinate in coordinate_list {
                let data_list = coordinate.as_array().unwrap();
                if data_list.len() > 2 {
                    for data in data_list {
                        if data[0].as_f64().unwrap() > max_x {
                            max_x = data[0].as_f64().unwrap();
                        }
                        if min_x < data[0].as_f64().unwrap() {
                            min_x = data[0].as_f64().unwrap();
                        }
                        if data[1].as_f64().unwrap() > max_y {
                            max_y = data[1].as_f64().unwrap();
                        }
                        if min_y < data[1].as_f64().unwrap() {
                            min_y = data[1].as_f64().unwrap();
                        }
                    }
                } else {
                    if data_list[0].as_f64().unwrap() > max_x {
                        max_x = data_list[0].as_f64().unwrap();
                    }
                    if min_x < data_list[0].as_f64().unwrap() {
                        min_x = data_list[0].as_f64().unwrap();
                    }
                    if data_list[1].as_f64().unwrap() > max_y {
                        max_y = data_list[1].as_f64().unwrap();
                    }
                    if min_y < data_list[1].as_f64().unwrap() {
                        min_y = data_list[1].as_f64().unwrap();
                    }
                }
            }
        }
    }

    let move_x = (y as f64 - ((max_x + min_x) / 2.00)) as f64;
    let move_y = (x as f64 - ((max_y + min_y) / 2.00)) as f64;

    log(&format!("{:?}", move_x));
    log(&format!("{:?}", move_y));

    // features边界线数据list
    for element in link["features"].as_array().unwrap() {
        // 坐标数据
        let coordinates = element["geometry"]["coordinates"].as_array().unwrap();
        for coordinate_element in coordinates {
            // log(&format!("{:?}", coordinate_element));
            let coordinate_list = coordinate_element.as_array().unwrap();
            // log(&format!("{:?}", coordinate_list));
            ctx.begin_path();
            for (j ,coordinate) in coordinate_list.iter().enumerate() {
                let data_list = coordinate.as_array().unwrap();
                if data_list.len() > 2 {
                    for (index, data) in data_list.iter().enumerate() {
                        let mut map_x = data[0].as_f64().unwrap() + move_x;
                        let mut map_y = data[1].as_f64().unwrap() + move_y;
                        let val_x = map_x - y;
                        let val_y = map_y - x;
                        map_x += (val_x as f64 * dip as f64);
                        map_y += (val_y as f64 * dip as f64);
                        if (map_y < x) {
                            map_y = x + (x - map_y)
                        } else {
                            map_y = x - (map_y - x)
                        }
                        if index == 0 {
                            ctx.move_to(map_x, map_y - height / 4.00);
                        }
                        ctx.line_to(map_x, map_y - height / 4.00);
                    }
                } else {
                    let mut map_x = data_list[0].as_f64().unwrap() + move_x;
                    let mut map_y = data_list[1].as_f64().unwrap() + move_y;
                    let val_x = map_x - y;
                    let val_y = map_y - x;
                    map_x += (val_x as f64 * dip as f64);
                    map_y += (val_y as f64 * dip as f64);
                    if (map_y < x) {
                        map_y = x + (x - map_y)
                    } else {
                        map_y = x - (map_y - x)
                    }
                    if j == 0 {
                        ctx.move_to(map_x, map_y - height / 4.00);
                    }
                    ctx.line_to(map_x, map_y - height / 4.00);
                }
            }
            ctx.stroke();
        }

    }

    Ok(())
}
pub fn set_json() -> &'static str {
    return r#" {此处为地图json数据} "
}

带我有空把多余的代码抽离出来!