use std::{
borrow::Cow,
collections::{BTreeMap, BTreeSet},
convert::Infallible,
f32::consts::E,
iter::once,
sync::{Arc, OnceLock},
};
use proc_macro2::{Span, TokenStream};
use quasiquote::quasiquote;
use quote::{format_ident, quote, ToTokens};
use sha3::Digest;
use syn::{Ident, Lifetime};
pub(crate) mod pit;
pub struct MemImport {
pub expr: TokenStream,
}
pub trait Plugin {
fn pre(&self, module: &mut OptsCore) -> anyhow::Result<()>;
fn import(
&self,
opts: &OptsCore,
module: &str,
name: &str,
params: Vec<TokenStream>,
) -> anyhow::Result<Option<TokenStream>>;
fn mem_import(
&self,
opts: &OptsCore,
module: &str,
name: &str,
) -> anyhow::Result<Option<MemImport>> {
Ok(None)
}
fn post(&self, opts: &OptsCore) -> anyhow::Result<TokenStream>;
fn bounds(&self, opts: &OptsCore) -> anyhow::Result<Option<TokenStream>> {
Ok(None)
}
fn exref_bounds(&self, opts: &OptsCore) -> anyhow::Result<Option<TokenStream>> {
Ok(None)
}
}
bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Flags: u32{
const ASYNC = 0x2;
const LEGACY = 0x4;
const NEW_ABI = 0x100;
const NEW_BACKEND = 0x200;
}
}
pub(crate) mod unswitch;
#[derive(Clone)]
pub struct OptsLt<'a, B> {
pub module: B,
pub core: OptsCore<'a>,
}
#[derive(Clone)]
pub struct OptsCore<'a> {
pub crate_path: syn::Path,
pub bytes: &'a [u8],
pub name: Ident,
pub flags: Flags,
pub embed: TokenStream,
pub data: BTreeMap<Ident, TokenStream>,
pub roots: BTreeMap<String, TokenStream>,
pub plugins: Vec<Arc<dyn Plugin + 'a>>,
}
impl<'a> OptsCore<'a> {
pub fn inflate(self) -> OptsLt<'a, &'a [u8]> {
OptsLt {
module: self.bytes,
core: self,
}
}
}
pub type Opts<B> = OptsLt<'static, B>;
pub(crate) const INTRINSIC: &'static str = "wars_intrinsic/";
pub(crate) mod r#impl;