dawn-codegen 0.1.2

Code generator for Dawn WebGPU API
Documentation
use crate::api_model::ApiModel;

use crate::emitter::core::{
    TypeIndex, build_callback_info_map, build_callback_info_mode_map, build_constant_map,
    emit_struct,
};

pub(crate) fn emit(model: &ApiModel, c_prefix: &str) -> String {
    let mut out = String::new();
    out.push_str(&format!(
        r#"#![allow(dead_code, unused_imports)]

use crate::ffi;
use crate::generated::*;
use std::any::Any;
use std::ffi::CStr;

pub(crate) fn string_view_to_string(view: ffi::{prefix}StringView) -> String {{
    if view.data.is_null() || view.length == 0 {{
        return String::new();
    }}
    let data = view.data.cast::<u8>();
    let slice = unsafe {{ std::slice::from_raw_parts(data, view.length) }};
    String::from_utf8_lossy(slice).into_owned()
}}

"#,
        prefix = c_prefix
    ));

    let index = TypeIndex::new(model);
    let constant_map = build_constant_map(model);
    let callback_info_map = build_callback_info_map(model);
    let callback_info_mode_map = build_callback_info_mode_map(model);
    for s in &model.structures {
        out.push_str(&emit_struct(
            s,
            &index,
            c_prefix,
            &callback_info_map,
            &callback_info_mode_map,
            &constant_map,
        ));
    }

    out
}