Collection work
Signed-off-by: Luca Fulchir <luca.fulchir@runesauth.com>
This commit is contained in:
parent
87b83371e8
commit
0c9bd1948f
@ -67,7 +67,14 @@ pub(crate) fn collection(
|
|||||||
::std::sync::Arc<
|
::std::sync::Arc<
|
||||||
dyn ::bok::PkgBuilder>>>,
|
dyn ::bok::PkgBuilder>>>,
|
||||||
}
|
}
|
||||||
impl ::bok::Collection for Collection {}
|
impl ::bok::Collection for Collection {
|
||||||
|
fn as_any(&self) -> &dyn ::std::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
fn as_any_mut(&mut self) -> &mut dyn ::std::any::Any {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
|
@ -308,7 +308,7 @@ pub(crate) fn deps(attrs: TokenStream, input: TokenStream) -> TokenStream {
|
|||||||
*
|
*
|
||||||
}
|
}
|
||||||
#[::macro_magic::export_tokens(#pkg_builder_trait)]
|
#[::macro_magic::export_tokens(#pkg_builder_trait)]
|
||||||
pub trait #pkg_builder_trait {
|
pub trait #pkg_builder_trait: ::bok::Collection {
|
||||||
#(fn #deps_builders2(&self)
|
#(fn #deps_builders2(&self)
|
||||||
-> ::std::boxed::Box<dyn #deps_options3>;)
|
-> ::std::boxed::Box<dyn #deps_options3>;)
|
||||||
*
|
*
|
||||||
@ -567,9 +567,14 @@ pub(crate) fn package_impl_builder(
|
|||||||
input: TokenStream,
|
input: TokenStream,
|
||||||
__source_path: TokenStream,
|
__source_path: TokenStream,
|
||||||
) -> TokenStream {
|
) -> TokenStream {
|
||||||
let local = parse_macro_input!(input as ::syn::ItemImpl);
|
|
||||||
let pkg = parse_macro_input!(attrs as ::syn::ItemStruct);
|
let pkg = parse_macro_input!(attrs as ::syn::ItemStruct);
|
||||||
|
let pkg_name = pkg.ident;
|
||||||
|
let name_builder = ::quote::format_ident!("{}Builder", pkg_name);
|
||||||
|
let trait_deps = ::quote::format_ident!("BokDeps{}", pkg_name);
|
||||||
|
let trait_options = ::quote::format_ident!("BokOptions{}", pkg_name);
|
||||||
|
let trait_deps_builder = quote::format_ident!("BokBuilderDeps{}", pkg_name);
|
||||||
|
|
||||||
|
let local = parse_macro_input!(input as ::syn::ItemImpl);
|
||||||
let local_path = &local.trait_.as_ref().unwrap().1;
|
let local_path = &local.trait_.as_ref().unwrap().1;
|
||||||
if local_path.segments.len() != 2
|
if local_path.segments.len() != 2
|
||||||
|| local_path.segments[0].ident.to_string() != "bok"
|
|| local_path.segments[0].ident.to_string() != "bok"
|
||||||
@ -583,24 +588,88 @@ pub(crate) fn package_impl_builder(
|
|||||||
.to_compile_error()
|
.to_compile_error()
|
||||||
.into();
|
.into();
|
||||||
}
|
}
|
||||||
let local_funcs = local.items.iter().filter(|&it| match it {
|
|
||||||
::syn::ImplItem::Fn(_) => true,
|
let local_span = local.span();
|
||||||
_ => false,
|
let local_funcs = local.items.into_iter().filter_map(|mut f| {
|
||||||
|
let ::syn::ImplItem::Fn(func) = &mut f else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
if func.sig.ident.to_string() != "set_dependencies" {
|
||||||
|
return Some(f);
|
||||||
|
}
|
||||||
|
if func.sig.inputs.len() != 5 {
|
||||||
|
return Some(f);
|
||||||
|
}
|
||||||
|
let args = func
|
||||||
|
.sig
|
||||||
|
.inputs
|
||||||
|
.iter()
|
||||||
|
.skip(1)
|
||||||
|
.filter_map(|arg_t| {
|
||||||
|
let ::syn::FnArg::Typed(arg_repo_t) = arg_t else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
let ::syn::Pat::Ident(arg_repo) = arg_repo_t.pat.as_ref()
|
||||||
|
else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
Some(&arg_repo.ident)
|
||||||
|
})
|
||||||
|
.collect::<Vec<&::syn::Ident>>();
|
||||||
|
if args.len() != 4 {
|
||||||
|
return Some(f);
|
||||||
|
};
|
||||||
|
let arg_repo = &args[0];
|
||||||
|
let arg_build = &args[1];
|
||||||
|
let arg_runtime = &args[2];
|
||||||
|
let arg_test = &args[3];
|
||||||
|
let mut proper_types: ::syn::ImplItemFn = ::syn::parse_quote! {
|
||||||
|
fn set_dependencies(
|
||||||
|
&self,
|
||||||
|
#arg_repo: ::std::sync::Arc<dyn ::bok::Repository>,
|
||||||
|
#arg_build: ::bok::deps::Build,
|
||||||
|
#arg_runtime: ::bok::deps::Runtime,
|
||||||
|
#arg_test: ::bok::deps::Test,
|
||||||
|
) -> Result<(), ()> {
|
||||||
|
let #arg_repo = {
|
||||||
|
let repo_any = #arg_repo.as_any();
|
||||||
|
let Some(actual_repo) = repo_any.downcast_ref::<R>() else {
|
||||||
|
return Err(());
|
||||||
|
};
|
||||||
|
Ok(actual_repo)
|
||||||
|
}?;
|
||||||
|
/*
|
||||||
|
let #arg_build = {
|
||||||
|
let build_any = #arg_build.0.as_any();
|
||||||
|
let Some(actual_build) =
|
||||||
|
build_any.downcast_ref::<#trait_deps_builder>() else {
|
||||||
|
return Err(());
|
||||||
|
};
|
||||||
|
Ok(::bok::deps::Build(actual_build))
|
||||||
|
}?;
|
||||||
|
*/
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
};
|
||||||
|
proper_types
|
||||||
|
.block
|
||||||
|
.stmts
|
||||||
|
.truncate(proper_types.block.stmts.len() - 1);
|
||||||
|
proper_types.block.stmts.append(&mut func.block.stmts);
|
||||||
|
func.block.stmts = proper_types.block.stmts;
|
||||||
|
|
||||||
|
return Some(f);
|
||||||
});
|
});
|
||||||
|
|
||||||
let ::syn::Fields::Named(elements) = pkg.fields else {
|
let ::syn::Fields::Named(elements) = pkg.fields else {
|
||||||
return ::syn::Error::new(
|
return ::syn::Error::new(
|
||||||
local.span(),
|
local_span,
|
||||||
"package_impl_builder: only named fields supported in base pkg",
|
"package_impl_builder: only named fields supported in base pkg",
|
||||||
)
|
)
|
||||||
.to_compile_error()
|
.to_compile_error()
|
||||||
.into();
|
.into();
|
||||||
};
|
};
|
||||||
|
|
||||||
let pkg_name = pkg.ident;
|
|
||||||
let name_builder = ::quote::format_ident!("{}Builder", pkg_name);
|
|
||||||
let trait_deps = ::quote::format_ident!("BokDeps{}", pkg_name);
|
|
||||||
let trait_options = ::quote::format_ident!("BokOptions{}", pkg_name);
|
|
||||||
let non_opt_fields = elements.named.iter().filter_map(|field| {
|
let non_opt_fields = elements.named.iter().filter_map(|field| {
|
||||||
if let Some(id) = field.ident.clone() {
|
if let Some(id) = field.ident.clone() {
|
||||||
if id.to_string() == "version"
|
if id.to_string() == "version"
|
||||||
|
@ -60,11 +60,13 @@ impl ::bok::PkgBuilder for One {
|
|||||||
_runtime: ::bok::deps::Runtime,
|
_runtime: ::bok::deps::Runtime,
|
||||||
_test: ::bok::deps::Test,
|
_test: ::bok::deps::Test,
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
|
/*
|
||||||
//TODO: automatically add repo type conversion via macro
|
//TODO: automatically add repo type conversion via macro
|
||||||
let repo_any = repo.as_any();
|
let repo_any = repo.as_any();
|
||||||
let Some(actual_repo) = repo_any.downcast_ref::<R>() else {
|
let Some(actual_repo) = repo_any.downcast_ref::<R>() else {
|
||||||
return Err(());
|
return Err(());
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -53,13 +53,6 @@ impl ::bok::PkgBuilder for Two {
|
|||||||
_runtime: ::bok::deps::Runtime,
|
_runtime: ::bok::deps::Runtime,
|
||||||
_test: ::bok::deps::Test,
|
_test: ::bok::deps::Test,
|
||||||
) -> Result<(), ()> {
|
) -> Result<(), ()> {
|
||||||
//TODO: automatically add repo type conversion via macro
|
|
||||||
let repo_any = repo.as_any();
|
|
||||||
let Some(actual_repo) = repo_any.downcast_ref::<R>() else {
|
|
||||||
return Err(());
|
|
||||||
};
|
|
||||||
let one = actual_repo.one();
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -33,4 +33,7 @@ pub type PkgMap =
|
|||||||
BTreeMap<Path<PkgName>, (Arc<dyn Repository>, ArcLock<dyn PkgBuilder>)>;
|
BTreeMap<Path<PkgName>, (Arc<dyn Repository>, ArcLock<dyn PkgBuilder>)>;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pub trait Collection {}
|
pub trait Collection: ::std::any::Any {
|
||||||
|
fn as_any(&self) -> &dyn ::std::any::Any;
|
||||||
|
fn as_any_mut(&mut self) -> &mut dyn ::std::any::Any;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user