summaryrefslogtreecommitdiff
path: root/crates/parser/src/lib.rs
blob: 39bb1c60a83e21f0d85f8cf2a618aef001e15a90 (plain)
#![no_std]
#![forbid(unsafe_code)]
#![cfg_attr(not(feature = "std"), feature(error_in_core))]

extern crate alloc;
#[cfg(feature = "std")]
extern crate std;

mod conversion;
mod error;
mod module;
use alloc::boxed::Box;
pub use error::*;
use module::ModuleReader;
use tinywasm_types::{Export, FuncType, Function};

pub struct Parser {}

impl Parser {
    pub fn parse_module_bytes(wasm: &[u8]) -> Result<TinyWasmModule> {
        let reader = ModuleReader::new();
        reader.try_into()
    }

    pub fn parse_module_file(file_name: &str) -> Result<TinyWasmModule> {
        let reader = ModuleReader::new();
        reader.try_into()
    }

    #[cfg(feature = "std")]
    pub fn parse_module_stream(stream: impl std::io::Read) -> Result<TinyWasmModule> {
        let reader = ModuleReader::new();
        reader.try_into()
    }

    pub fn read_module_bytes(bytes: &[u8]) -> Result<TinyWasmModule> {
        unimplemented!()
    }
    pub fn read_module_file(file_name: &str) -> Result<TinyWasmModule> {
        unimplemented!()
    }
    #[cfg(feature = "std")]
    pub fn read_module_stream(stream: impl std::io::Read) -> Result<TinyWasmModule> {
        unimplemented!()
    }
}

pub struct TinyWasmModule {
    pub version: Option<u16>,
    pub start_func: Option<u32>,

    pub types: Option<Box<[FuncType]>>,
    pub funcs: Option<Box<[Function]>>,
    pub exports: Option<Box<[Export]>>,
    // pub tables: Option<TableType>,
    // pub memories: Option<MemoryType>,
    // pub globals: Option<GlobalType>,
    // pub elements: Option<ElementSectionReader<'a>>,
    // pub imports: Option<ImportSectionReader<'a>>,
    // pub data_segments: Option<DataSectionReader<'a>>,
}

impl TryFrom<ModuleReader<'_>> for TinyWasmModule {
    type Error = ParseError;

    fn try_from(reader: ModuleReader<'_>) -> Result<Self> {
        if !reader.end_reached {
            return Err(ParseError::EndNotReached);
        }

        unimplemented!()
    }
}