use crate::prelude::*;
use beet_core::prelude::*;
use beet_dom::prelude::*;
use bevy::ecs::schedule::ScheduleLabel;
use proc_macro2::TokenStream;
#[derive(Debug, Default, Clone, PartialEq, Eq, Hash, ScheduleLabel)]
pub struct ParseRsxTokens;
fn rstml(tokens: TokenStream, source_file: WsPathBuf) -> impl Bundle {
(
SnippetRoot::new_from_tokens(source_file, &tokens),
InstanceRoot,
RstmlTokens::new(tokens),
)
}
fn combinator(tokens: &str, source_file: WsPathBuf) -> impl Bundle {
(
SnippetRoot::new(source_file, LineCol::default()),
InstanceRoot,
CombinatorTokens::new(tokens),
)
}
impl ParseRsxTokens {
pub fn combinator_to_rsx(
tokens: &str,
source_file: WsPathBuf,
) -> Result<TokenStream> {
Self::parse_bundle(
combinator(tokens, source_file),
tokenize_rsx_resolve_snippet,
)
}
pub fn combinator_to_rsx_tokens(
tokens: &str,
source_file: WsPathBuf,
) -> Result<TokenStream> {
Self::parse_bundle(combinator(tokens, source_file), tokenize_rsx_tokens)
}
pub fn rstml_to_bsx(
tokens: TokenStream,
source_file: WsPathBuf,
) -> Result<TokenStream> {
Self::parse_bundle(rstml(tokens, source_file), tokenize_bsx_root)
}
pub fn rstml_to_rsx(
tokens: TokenStream,
source_file: WsPathBuf,
) -> Result<TokenStream> {
Self::parse_bundle(
rstml(tokens, source_file),
tokenize_rsx_resolve_snippet,
)
}
pub fn rstml_to_rsx_tokens(
tokens: TokenStream,
source_file: WsPathBuf,
) -> Result<TokenStream> {
Self::parse_bundle(rstml(tokens, source_file), tokenize_rsx_tokens)
}
fn parse_bundle(
bundle: impl Bundle,
func: impl FnOnce(&World, Entity) -> Result<TokenStream>,
) -> Result<TokenStream> {
let mut app = App::new();
app.add_plugins(ParseRsxTokensPlugin);
let world = app.world_mut();
let entity = world.spawn(bundle).id();
world.run_schedule(ParseRsxTokens);
let tokens = func(world, entity)?;
let imports = dom_imports();
quote::quote! {{
#imports
#tokens
}}
.xok()
}
}