diff options
author | HampusM <hampus@hampusmat.com> | 2022-07-20 14:29:45 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-07-20 14:29:45 +0200 |
commit | 2d1a6b2d432408d74eb57e0bda3f7434617e1070 (patch) | |
tree | 7e21f8126edfdfd9c40b4b51ba5626c6440442d9 /syrette_macros/src | |
parent | 7863d9859a5cbce99c3769e4fdb40283115d358d (diff) |
refactor: reorganize folder hierarchy
Diffstat (limited to 'syrette_macros/src')
-rw-r--r-- | syrette_macros/src/declare_interface_args.rs | 23 | ||||
-rw-r--r-- | syrette_macros/src/factory_type_alias.rs | 84 | ||||
-rw-r--r-- | syrette_macros/src/injectable_impl.rs | 245 | ||||
-rw-r--r-- | syrette_macros/src/injectable_macro_args.rs | 17 | ||||
-rw-r--r-- | syrette_macros/src/lib.rs | 96 | ||||
-rw-r--r-- | syrette_macros/src/libs/intertrait_macros/LICENSE-APACHE | 176 | ||||
-rw-r--r-- | syrette_macros/src/libs/intertrait_macros/LICENSE-MIT | 17 | ||||
-rw-r--r-- | syrette_macros/src/libs/intertrait_macros/gen_caster.rs | 55 | ||||
-rw-r--r-- | syrette_macros/src/libs/intertrait_macros/mod.rs | 14 | ||||
-rw-r--r-- | syrette_macros/src/libs/mod.rs | 1 |
10 files changed, 0 insertions, 728 deletions
diff --git a/syrette_macros/src/declare_interface_args.rs b/syrette_macros/src/declare_interface_args.rs deleted file mode 100644 index b54f458..0000000 --- a/syrette_macros/src/declare_interface_args.rs +++ /dev/null @@ -1,23 +0,0 @@ -use syn::parse::{Parse, ParseStream, Result}; -use syn::{Path, Token, Type}; - -pub struct DeclareInterfaceArgs -{ - pub implementation: Type, - pub interface: Path, -} - -impl Parse for DeclareInterfaceArgs -{ - fn parse(input: ParseStream) -> Result<Self> - { - let implementation: Type = input.parse()?; - - input.parse::<Token![->]>()?; - - Ok(Self { - implementation, - interface: input.parse()?, - }) - } -} diff --git a/syrette_macros/src/factory_type_alias.rs b/syrette_macros/src/factory_type_alias.rs deleted file mode 100644 index 8ea7baa..0000000 --- a/syrette_macros/src/factory_type_alias.rs +++ /dev/null @@ -1,84 +0,0 @@ -use syn::parse::{Parse, ParseStream}; -use syn::{GenericArgument, ItemType, Path, Type, TypeParamBound, TypeTuple}; - -pub struct FactoryTypeAlias -{ - pub type_alias: ItemType, - pub factory_interface: Path, - pub arg_types: TypeTuple, - pub return_type: Type, -} - -impl Parse for FactoryTypeAlias -{ - #[allow(clippy::match_wildcard_for_single_variants)] - fn parse(input: ParseStream) -> syn::Result<Self> - { - let type_alias = match input.parse::<ItemType>() { - Ok(type_alias) => Ok(type_alias), - Err(_) => Err(input.error("Expected a type alias")), - }?; - - let aliased_trait = match &type_alias.ty.as_ref() { - Type::TraitObject(alias_type) => Ok(alias_type), - &_ => Err(input.error("Expected the aliased type to be a trait")), - }?; - - if aliased_trait.bounds.len() != 1 { - return Err(input.error("Expected the aliased trait to have a single bound.")); - } - - let bound_path = &match aliased_trait.bounds.first().unwrap() { - TypeParamBound::Trait(trait_bound) => Ok(trait_bound), - &_ => { - Err(input.error("Expected the bound of the aliased trait to be a trait")) - } - }? - .path; - - if bound_path.segments.is_empty() - || bound_path.segments.last().unwrap().ident != "IFactory" - { - return Err(input - .error("Expected the bound of the aliased trait to be 'dyn IFactory'")); - } - - let angle_bracketed_args = match &bound_path.segments.last().unwrap().arguments { - syn::PathArguments::AngleBracketed(angle_bracketed_args) => { - Ok(angle_bracketed_args) - } - &_ => { - Err(input.error("Expected angle bracketed arguments for 'dyn IFactory'")) - } - }?; - - let arg_types = match &angle_bracketed_args.args[0] { - GenericArgument::Type(arg_types_type) => match arg_types_type { - Type::Tuple(arg_types) => Ok(arg_types), - &_ => Err(input.error(concat!( - "Expected the first angle bracketed argument ", - "of 'dyn IFactory' to be a type tuple" - ))), - }, - &_ => Err(input.error(concat!( - "Expected the first angle bracketed argument ", - "of 'dyn IFactory' to be a type" - ))), - }?; - - let return_type = match &angle_bracketed_args.args[1] { - GenericArgument::Type(arg_type) => Ok(arg_type), - &_ => Err(input.error(concat!( - "Expected the second angle bracketed argument ", - "of 'dyn IFactory' to be a type" - ))), - }?; - - Ok(Self { - type_alias: type_alias.clone(), - factory_interface: bound_path.clone(), - arg_types: arg_types.clone(), - return_type: return_type.clone(), - }) - } -} diff --git a/syrette_macros/src/injectable_impl.rs b/syrette_macros/src/injectable_impl.rs deleted file mode 100644 index 3000253..0000000 --- a/syrette_macros/src/injectable_impl.rs +++ /dev/null @@ -1,245 +0,0 @@ -use quote::{quote, ToTokens}; -use syn::parse::{Parse, ParseStream}; -use syn::{ - parse_str, punctuated::Punctuated, token::Comma, ExprMethodCall, FnArg, - GenericArgument, Ident, ImplItem, ImplItemMethod, ItemImpl, Path, PathArguments, - Type, TypePath, -}; - -const DI_CONTAINER_VAR_NAME: &str = "di_container"; - -pub struct InjectableImpl -{ - pub dependency_types: Vec<Type>, - pub self_type: Type, - pub original_impl: ItemImpl, -} - -impl Parse for InjectableImpl -{ - fn parse(input: ParseStream) -> syn::Result<Self> - { - match input.parse::<ItemImpl>() { - Ok(impl_parsed_input) => { - match Self::_get_dependency_types(&impl_parsed_input) { - Ok(dependency_types) => Ok(Self { - dependency_types, - self_type: impl_parsed_input.self_ty.as_ref().clone(), - original_impl: impl_parsed_input, - }), - Err(error_msg) => Err(input.error(error_msg)), - } - } - Err(_) => Err(input.error("Expected an impl")), - } - } -} - -impl InjectableImpl -{ - pub fn expand(&self) -> proc_macro2::TokenStream - { - let original_impl = &self.original_impl; - let self_type = &self.self_type; - - let di_container_var: Ident = parse_str(DI_CONTAINER_VAR_NAME).unwrap(); - - let get_dependencies = Self::_create_get_dependencies(&self.dependency_types); - - quote! { - #original_impl - - impl syrette::interfaces::injectable::Injectable for #self_type { - fn resolve( - #di_container_var: &syrette::DIContainer - ) -> error_stack::Result< - syrette::ptr::InterfacePtr<Self>, - syrette::errors::injectable::ResolveError> - { - use error_stack::ResultExt; - - return Ok(syrette::ptr::InterfacePtr::new(Self::new( - #(#get_dependencies - .change_context(syrette::errors::injectable::ResolveError) - .attach_printable( - format!( - "Unable to resolve a dependency of {}", - std::any::type_name::<#self_type>() - ) - )? - ),* - ))); - } - } - } - } - - fn _create_get_dependencies(dependency_types: &[Type]) -> Vec<ExprMethodCall> - { - dependency_types - .iter() - .filter_map(|dep_type| match dep_type { - Type::TraitObject(dep_type_trait) => Some( - parse_str( - format!( - "{}.get::<{}>()", - DI_CONTAINER_VAR_NAME, - dep_type_trait.to_token_stream() - ) - .as_str(), - ) - .unwrap(), - ), - Type::Path(dep_type_path) => { - let dep_type_path_str = Self::_path_to_string(&dep_type_path.path); - - let get_method_name = if dep_type_path_str.ends_with("Factory") { - "get_factory" - } else { - "get" - }; - - Some( - parse_str( - format!( - "{}.{}::<{}>()", - DI_CONTAINER_VAR_NAME, get_method_name, dep_type_path_str - ) - .as_str(), - ) - .unwrap(), - ) - } - &_ => None, - }) - .collect() - } - - fn _find_method_by_name<'impl_lt>( - item_impl: &'impl_lt ItemImpl, - method_name: &'static str, - ) -> Option<&'impl_lt ImplItemMethod> - { - let impl_items = &item_impl.items; - - impl_items - .iter() - .filter_map(|impl_item| match impl_item { - ImplItem::Method(method_item) => Some(method_item), - &_ => None, - }) - .find(|method_item| method_item.sig.ident == method_name) - } - - #[allow(clippy::match_wildcard_for_single_variants)] - fn get_has_fn_args_self(fn_args: &Punctuated<FnArg, Comma>) -> bool - { - fn_args.iter().any(|arg| match arg { - FnArg::Receiver(_) => true, - &_ => false, - }) - } - - fn _get_fn_arg_type_paths(fn_args: &Punctuated<FnArg, Comma>) -> Vec<&TypePath> - { - fn_args - .iter() - .filter_map(|arg| match arg { - FnArg::Typed(typed_fn_arg) => match typed_fn_arg.ty.as_ref() { - Type::Path(arg_type_path) => Some(arg_type_path), - Type::Reference(ref_type_path) => match ref_type_path.elem.as_ref() { - Type::Path(arg_type_path) => Some(arg_type_path), - &_ => None, - }, - &_ => None, - }, - FnArg::Receiver(_receiver_fn_arg) => None, - }) - .collect() - } - - fn _path_to_string(path: &Path) -> String - { - path.segments - .pairs() - .fold(String::new(), |mut acc, segment_pair| { - let segment_ident = &segment_pair.value().ident; - - acc.push_str(segment_ident.to_string().as_str()); - - let opt_colon_two = segment_pair.punct(); - - match opt_colon_two { - Some(colon_two) => { - acc.push_str(colon_two.to_token_stream().to_string().as_str()); - } - None => {} - } - - acc - }) - } - - fn _is_type_path_ptr(type_path: &TypePath) -> bool - { - let arg_type_path_string = Self::_path_to_string(&type_path.path); - - arg_type_path_string == "InterfacePtr" - || arg_type_path_string == "ptr::InterfacePtr" - || arg_type_path_string == "syrrete::ptr::InterfacePtr" - || arg_type_path_string == "FactoryPtr" - || arg_type_path_string == "ptr::FactoryPtr" - || arg_type_path_string == "syrrete::ptr::FactoryPtr" - } - - fn _get_dependency_types(item_impl: &ItemImpl) -> Result<Vec<Type>, &'static str> - { - let new_method_impl_item = match Self::_find_method_by_name(item_impl, "new") { - Some(method_item) => Ok(method_item), - None => Err("Missing a 'new' method"), - }?; - - let new_method_args = &new_method_impl_item.sig.inputs; - - if Self::get_has_fn_args_self(new_method_args) { - return Err("Unexpected self argument in 'new' method"); - } - - let new_method_arg_type_paths = Self::_get_fn_arg_type_paths(new_method_args); - - if new_method_arg_type_paths - .iter() - .any(|arg_type_path| !Self::_is_type_path_ptr(arg_type_path)) - { - return Err("All argument types in 'new' method must ptr types"); - } - - Ok(new_method_arg_type_paths - .iter() - .filter_map(|arg_type_path| { - // Assume the type path has a last segment. - let last_path_segment = arg_type_path.path.segments.last().unwrap(); - - match &last_path_segment.arguments { - PathArguments::AngleBracketed(angle_bracketed_generic_args) => { - let generic_args = &angle_bracketed_generic_args.args; - - let opt_first_generic_arg = generic_args.first(); - - // Assume a first generic argument exists because InterfacePtr and - // FactoryPtr requires one - let first_generic_arg = opt_first_generic_arg.as_ref().unwrap(); - - match first_generic_arg { - GenericArgument::Type(first_generic_arg_type) => { - Some(first_generic_arg_type.clone()) - } - &_ => None, - } - } - &_ => None, - } - }) - .collect()) - } -} diff --git a/syrette_macros/src/injectable_macro_args.rs b/syrette_macros/src/injectable_macro_args.rs deleted file mode 100644 index 4ef4389..0000000 --- a/syrette_macros/src/injectable_macro_args.rs +++ /dev/null @@ -1,17 +0,0 @@ -use syn::parse::{Parse, ParseStream}; -use syn::TypePath; - -pub struct InjectableMacroArgs -{ - pub interface: TypePath, -} - -impl Parse for InjectableMacroArgs -{ - fn parse(input: ParseStream) -> syn::Result<Self> - { - Ok(Self { - interface: input.parse()?, - }) - } -} diff --git a/syrette_macros/src/lib.rs b/syrette_macros/src/lib.rs deleted file mode 100644 index ed1a509..0000000 --- a/syrette_macros/src/lib.rs +++ /dev/null @@ -1,96 +0,0 @@ -#![deny(clippy::all)] -#![deny(clippy::pedantic)] - -use proc_macro::TokenStream; -use quote::quote; -use syn::{parse, parse_macro_input}; - -mod declare_interface_args; -mod factory_type_alias; -mod injectable_impl; -mod injectable_macro_args; -mod libs; - -use declare_interface_args::DeclareInterfaceArgs; -use factory_type_alias::FactoryTypeAlias; -use injectable_impl::InjectableImpl; -use injectable_macro_args::InjectableMacroArgs; -use libs::intertrait_macros::gen_caster::generate_caster; - -/// Makes a struct injectable. Thereby usable with `DIContainer`. -/// -/// # Arguments -/// * A interface trait the struct implements. -/// -/// # Panics -/// If the attributed item is not a impl. -#[proc_macro_attribute] -pub fn injectable(args_stream: TokenStream, impl_stream: TokenStream) -> TokenStream -{ - let InjectableMacroArgs { - interface: interface_type_path, - } = parse_macro_input!(args_stream); - - let injectable_impl: InjectableImpl = parse(impl_stream).unwrap(); - - let expanded_injectable_impl = injectable_impl.expand(); - - let self_type = &injectable_impl.self_type; - - quote! { - #expanded_injectable_impl - - syrette::declare_interface!(#self_type -> #interface_type_path); - } - .into() -} - -/// Makes a type alias usable as a factory interface. -/// -/// # Panics -/// If the attributed item is not a type alias. -#[proc_macro_attribute] -pub fn factory(_: TokenStream, type_alias_stream: TokenStream) -> TokenStream -{ - let FactoryTypeAlias { - type_alias, - factory_interface, - arg_types, - return_type, - } = parse(type_alias_stream).unwrap(); - - quote! { - #type_alias - - syrette::declare_interface!( - syrette::castable_factory::CastableFactory< - #arg_types, - #return_type - > -> #factory_interface - ); - - syrette::declare_interface!( - syrette::castable_factory::CastableFactory< - #arg_types, - #return_type - > -> syrette::castable_factory::AnyFactory - ); - } - .into() -} - -/// Declares the interface trait of a implementation. -/// -/// # Arguments -/// {Implementation} -> {Interface} -/// -#[proc_macro] -pub fn declare_interface(input: TokenStream) -> TokenStream -{ - let DeclareInterfaceArgs { - implementation, - interface, - } = parse_macro_input!(input); - - generate_caster(&implementation, &interface).into() -} diff --git a/syrette_macros/src/libs/intertrait_macros/LICENSE-APACHE b/syrette_macros/src/libs/intertrait_macros/LICENSE-APACHE deleted file mode 100644 index d9a10c0..0000000 --- a/syrette_macros/src/libs/intertrait_macros/LICENSE-APACHE +++ /dev/null @@ -1,176 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/syrette_macros/src/libs/intertrait_macros/LICENSE-MIT b/syrette_macros/src/libs/intertrait_macros/LICENSE-MIT deleted file mode 100644 index 969d061..0000000 --- a/syrette_macros/src/libs/intertrait_macros/LICENSE-MIT +++ /dev/null @@ -1,17 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/syrette_macros/src/libs/intertrait_macros/gen_caster.rs b/syrette_macros/src/libs/intertrait_macros/gen_caster.rs deleted file mode 100644 index 9126200..0000000 --- a/syrette_macros/src/libs/intertrait_macros/gen_caster.rs +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Originally from Intertrait by CodeChain - * - * <https://github.com/CodeChain-io/intertrait> - * <https://crates.io/crates/intertrait/0.2.2> - * - * Licensed under either of - * - * Apache License, Version 2.0 (LICENSE-APACHE or <http://www.apache.org/licenses/LICENSE-2.0>) - * MIT license (LICENSE-MIT or <http://opensource.org/licenses/MIT>) - - * at your option. -*/ -use std::str::from_utf8_unchecked; - -use proc_macro2::TokenStream; -use quote::format_ident; -use quote::quote; -use quote::ToTokens; -use uuid::adapter::Simple; -use uuid::Uuid; - -pub fn generate_caster(ty: &impl ToTokens, trait_: &impl ToTokens) -> TokenStream -{ - let mut fn_buf = [0u8; FN_BUF_LEN]; - - let fn_ident = format_ident!("{}", new_fn_name(&mut fn_buf)); - - let new_caster = quote! { - syrette::libs::intertrait::Caster::<dyn #trait_>::new( - |from| from.downcast::<#ty>().unwrap(), - |from| from.downcast::<#ty>().unwrap(), - ) - }; - - quote! { - #[syrette::libs::linkme::distributed_slice(syrette::libs::intertrait::CASTERS)] - #[linkme(crate = syrette::libs::linkme)] - fn #fn_ident() -> (::std::any::TypeId, syrette::libs::intertrait::BoxedCaster) { - (::std::any::TypeId::of::<#ty>(), Box::new(#new_caster)) - } - } -} - -const FN_PREFIX: &[u8] = b"__"; -const FN_BUF_LEN: usize = FN_PREFIX.len() + Simple::LENGTH; - -fn new_fn_name(buf: &mut [u8]) -> &str -{ - buf[..FN_PREFIX.len()].copy_from_slice(FN_PREFIX); - Uuid::new_v4() - .to_simple() - .encode_lower(&mut buf[FN_PREFIX.len()..]); - unsafe { from_utf8_unchecked(&buf[..FN_BUF_LEN]) } -} diff --git a/syrette_macros/src/libs/intertrait_macros/mod.rs b/syrette_macros/src/libs/intertrait_macros/mod.rs deleted file mode 100644 index fa8c021..0000000 --- a/syrette_macros/src/libs/intertrait_macros/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -/** - * Originally from Intertrait by CodeChain - * - * <https://github.com/CodeChain-io/intertrait> - * <https://crates.io/crates/intertrait/0.2.2> - * - * Licensed under either of - * - * Apache License, Version 2.0 (LICENSE-APACHE or <http://www.apache.org/licenses/LICENSE-2.0>) - * MIT license (LICENSE-MIT or <http://opensource.org/licenses/MIT>) - - * at your option. -*/ -pub mod gen_caster; diff --git a/syrette_macros/src/libs/mod.rs b/syrette_macros/src/libs/mod.rs deleted file mode 100644 index e4964de..0000000 --- a/syrette_macros/src/libs/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod intertrait_macros; |