diff options
author | HampusM <hampus@hampusmat.com> | 2022-11-19 15:45:12 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-11-19 15:45:12 +0100 |
commit | 9f27a925bd323e8e0864bedeb33a3c6953517ea1 (patch) | |
tree | ea5d8faaed82c58fa037fa377173bb365e1cd697 /src/libs | |
parent | d99cbf9fa95856cbc14a3217e1cd3f13aeb2e0b3 (diff) |
refactor: reorganize non-public API items
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/intertrait/LICENSE-APACHE | 176 | ||||
-rw-r--r-- | src/libs/intertrait/LICENSE-MIT | 17 | ||||
-rw-r--r-- | src/libs/intertrait/cast/arc.rs | 93 | ||||
-rw-r--r-- | src/libs/intertrait/cast/box.rs | 87 | ||||
-rw-r--r-- | src/libs/intertrait/cast/error.rs | 20 | ||||
-rw-r--r-- | src/libs/intertrait/cast/mod.rs | 20 | ||||
-rw-r--r-- | src/libs/intertrait/cast/rc.rs | 87 | ||||
-rw-r--r-- | src/libs/intertrait/mod.rs | 282 | ||||
-rw-r--r-- | src/libs/mod.rs | 3 |
9 files changed, 0 insertions, 785 deletions
diff --git a/src/libs/intertrait/LICENSE-APACHE b/src/libs/intertrait/LICENSE-APACHE deleted file mode 100644 index d9a10c0..0000000 --- a/src/libs/intertrait/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/src/libs/intertrait/LICENSE-MIT b/src/libs/intertrait/LICENSE-MIT deleted file mode 100644 index 969d061..0000000 --- a/src/libs/intertrait/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/src/libs/intertrait/cast/arc.rs b/src/libs/intertrait/cast/arc.rs deleted file mode 100644 index a1b2c30..0000000 --- a/src/libs/intertrait/cast/arc.rs +++ /dev/null @@ -1,93 +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::any::type_name; -use std::sync::Arc; - -use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{get_caster, CastFromSync}; - -pub trait CastArc -{ - /// Casts an `Arc` with `Self` into an `Arc` with `Dest`. - fn cast<Dest: ?Sized + 'static>(self: Arc<Self>) -> Result<Arc<Dest>, CastError>; -} - -/// A blanket implementation of `CastArc` for traits extending `CastFrom`, `Sync`, and -/// `Send`. -impl<CastFromSelf: ?Sized + CastFromSync> CastArc for CastFromSelf -{ - fn cast<Dest: ?Sized + 'static>(self: Arc<Self>) -> Result<Arc<Dest>, CastError> - { - let caster = - get_caster::<Dest>((*self).type_id()).map_err(CastError::GetCasterFailed)?; - - let cast_arc = caster - .opt_cast_arc - .ok_or(CastError::NotArcCastable(type_name::<Dest>()))?; - - cast_arc(self.arc_any()).map_err(|err| CastError::CastFailed { - source: err, - from: type_name::<Self>(), - to: type_name::<Dest>(), - }) - } -} - -#[cfg(test)] -mod tests -{ - use std::any::Any; - use std::fmt::{Debug, Display}; - use std::sync::Arc; - - use super::*; - use crate::test_utils::subjects; - - #[test] - fn can_cast_arc() - { - let concrete_ninja = Arc::new(subjects::Ninja); - - let abstract_ninja: Arc<dyn subjects::INinja> = concrete_ninja; - - let debug_ninja_result = abstract_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } - - #[test] - fn cannot_cast_arc_wrong() - { - let concrete_ninja = Arc::new(subjects::Ninja); - - let abstract_ninja: Arc<dyn subjects::INinja> = concrete_ninja; - - let display_ninja_result = abstract_ninja.cast::<dyn Display>(); - - assert!(matches!( - display_ninja_result, - Err(CastError::GetCasterFailed(_)) - )); - } - - #[test] - fn can_cast_arc_from_any() - { - let concrete_ninja = Arc::new(subjects::Ninja); - - let any_ninja: Arc<dyn Any + Send + Sync> = concrete_ninja; - - let debug_ninja_result = any_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } -} diff --git a/src/libs/intertrait/cast/box.rs b/src/libs/intertrait/cast/box.rs deleted file mode 100644 index fcd5f70..0000000 --- a/src/libs/intertrait/cast/box.rs +++ /dev/null @@ -1,87 +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::any::type_name; - -use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{get_caster, CastFrom}; - -pub trait CastBox -{ - /// Casts a `Box` with `Self` into a `Box` with `Dest`. - fn cast<Dest: ?Sized + 'static>(self: Box<Self>) -> Result<Box<Dest>, CastError>; -} - -/// A blanket implementation of `CastBox` for traits extending `CastFrom`. -impl<CastFromSelf: ?Sized + CastFrom> CastBox for CastFromSelf -{ - fn cast<Dest: ?Sized + 'static>(self: Box<Self>) -> Result<Box<Dest>, CastError> - { - let caster = - get_caster::<Dest>((*self).type_id()).map_err(CastError::GetCasterFailed)?; - - (caster.cast_box)(self.box_any()).map_err(|err| CastError::CastFailed { - source: err, - from: type_name::<Self>(), - to: type_name::<Dest>(), - }) - } -} - -#[cfg(test)] -mod tests -{ - use std::any::Any; - use std::fmt::{Debug, Display}; - - use super::*; - use crate::test_utils::subjects; - - #[test] - fn can_cast_box() - { - let concrete_ninja = Box::new(subjects::Ninja); - - let abstract_ninja: Box<dyn subjects::INinja> = concrete_ninja; - - let debug_ninja_result = abstract_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } - - #[test] - fn cannot_cast_box_wrong() - { - let concrete_ninja = Box::new(subjects::Ninja); - - let abstract_ninja: Box<dyn subjects::INinja> = concrete_ninja; - - let display_ninja_result = abstract_ninja.cast::<dyn Display>(); - - assert!(matches!( - display_ninja_result, - Err(CastError::GetCasterFailed(_)) - )); - } - - #[test] - fn can_cast_box_from_any() - { - let concrete_ninja = Box::new(subjects::Ninja); - - let any_ninja: Box<dyn Any> = concrete_ninja; - - let debug_ninja_result = any_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } -} diff --git a/src/libs/intertrait/cast/error.rs b/src/libs/intertrait/cast/error.rs deleted file mode 100644 index d253fc5..0000000 --- a/src/libs/intertrait/cast/error.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::libs::intertrait::{CasterError, GetCasterError}; - -#[derive(thiserror::Error, Debug)] -pub enum CastError -{ - #[error("Failed to get caster")] - GetCasterFailed(#[from] GetCasterError), - - #[error("Failed to cast from {from} to {to}")] - CastFailed - { - #[source] - source: CasterError, - from: &'static str, - to: &'static str, - }, - - #[error("'{0}' can't be cast to an Arc")] - NotArcCastable(&'static str), -} diff --git a/src/libs/intertrait/cast/mod.rs b/src/libs/intertrait/cast/mod.rs deleted file mode 100644 index a0342cf..0000000 --- a/src/libs/intertrait/cast/mod.rs +++ /dev/null @@ -1,20 +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 error; - -mod arc; -mod r#box; -mod rc; - -pub use arc::*; -pub use r#box::*; -pub use rc::*; diff --git a/src/libs/intertrait/cast/rc.rs b/src/libs/intertrait/cast/rc.rs deleted file mode 100644 index 8567d1e..0000000 --- a/src/libs/intertrait/cast/rc.rs +++ /dev/null @@ -1,87 +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::any::type_name; -use std::rc::Rc; - -use crate::libs::intertrait::cast::error::CastError; -use crate::libs::intertrait::{get_caster, CastFrom}; - -pub trait CastRc -{ - /// Casts an `Rc` with `Self `into a `Rc` with `Dest`. - fn cast<Dest: ?Sized + 'static>(self: Rc<Self>) -> Result<Rc<Dest>, CastError>; -} - -/// A blanket implementation of `CastRc` for traits extending `CastFrom`. -impl<CastFromSelf: ?Sized + CastFrom> CastRc for CastFromSelf -{ - fn cast<Dest: ?Sized + 'static>(self: Rc<Self>) -> Result<Rc<Dest>, CastError> - { - let caster = - get_caster::<Dest>((*self).type_id()).map_err(CastError::GetCasterFailed)?; - - (caster.cast_rc)(self.rc_any()).map_err(|err| CastError::CastFailed { - source: err, - from: type_name::<Self>(), - to: type_name::<Dest>(), - }) - } -} - -#[cfg(test)] -mod tests -{ - use std::any::Any; - use std::fmt::{Debug, Display}; - - use super::*; - use crate::test_utils::subjects; - - #[test] - fn can_cast_rc() - { - let concrete_ninja = Rc::new(subjects::Ninja); - - let abstract_ninja: Rc<dyn subjects::INinja> = concrete_ninja; - - let debug_ninja_result = abstract_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } - - #[test] - fn cannot_cast_rc_wrong() - { - let concrete_ninja = Rc::new(subjects::Ninja); - - let abstract_ninja: Rc<dyn subjects::INinja> = concrete_ninja; - - let display_ninja_result = abstract_ninja.cast::<dyn Display>(); - - assert!(matches!( - display_ninja_result, - Err(CastError::GetCasterFailed(_)) - )); - } - - #[test] - fn can_cast_rc_from_any() - { - let concrete_ninja = Rc::new(subjects::Ninja); - - let any_ninja: Rc<dyn Any> = concrete_ninja; - - let debug_ninja_result = any_ninja.cast::<dyn Debug>(); - - assert!(debug_ninja_result.is_ok()); - } -} diff --git a/src/libs/intertrait/mod.rs b/src/libs/intertrait/mod.rs deleted file mode 100644 index d2ace67..0000000 --- a/src/libs/intertrait/mod.rs +++ /dev/null @@ -1,282 +0,0 @@ -//! A library providing direct casting among trait objects implemented by a type. -//! -//! In Rust, an object of a sub-trait of [`Any`] can be downcast to a concrete type -//! at runtime if the type is known. But no direct casting between two trait objects -//! (i.e. without involving the concrete type of the backing value) is possible -//! (even no coercion from a trait object to that of its super-trait yet). -//! -//! With this crate, any trait object with [`CastFrom`] as its super-trait can be cast -//! directly to another trait object implemented by the underlying type if the target -//! traits are registered beforehand with the macros provided by this crate. -//! -//! -//! 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::any::{Any, TypeId}; -use std::rc::Rc; -use std::sync::Arc; - -use ahash::AHashMap; -use linkme::distributed_slice; -use once_cell::sync::Lazy; - -pub mod cast; - -pub type BoxedCaster = Box<dyn Any + Send + Sync>; - -/// A distributed slice gathering constructor functions for [`Caster`]s. -/// -/// A constructor function returns `TypeId` of a concrete type involved in the casting -/// and a `Box` of a type or trait backed by a [`Caster`]. -#[distributed_slice] -pub static CASTERS: [fn() -> (TypeId, BoxedCaster)] = [..]; - -/// A `HashMap` mapping `TypeId` of a [`Caster`] to an instance of it. -static CASTER_MAP: Lazy<AHashMap<(TypeId, TypeId), BoxedCaster>> = Lazy::new(|| { - CASTERS - .iter() - .map(|caster_fn| { - let (type_id, caster) = caster_fn(); - - ((type_id, (*caster).type_id()), caster) - }) - .collect() -}); - -type CastBoxFn<Dest> = fn(from: Box<dyn Any>) -> Result<Box<Dest>, CasterError>; - -type CastRcFn<Dest> = fn(from: Rc<dyn Any>) -> Result<Rc<Dest>, CasterError>; - -type CastArcFn<Dest> = - fn(from: Arc<dyn Any + Sync + Send + 'static>) -> Result<Arc<Dest>, CasterError>; - -/// A `Caster` knows how to cast a type or trait to the type or trait `Dest`. Each -/// `Caster` instance is specific to a concrete type. That is, it knows how to cast to -/// single specific type or trait implemented by single specific type. -pub struct Caster<Dest: ?Sized + 'static> -{ - /// Casts a `Box` holding a type or trait object for `Any` to another `Box` holding a - /// type or trait `Dest`. - pub cast_box: CastBoxFn<Dest>, - - /// Casts an `Rc` holding a type or trait for `Any` to another `Rc` holding a type or - /// trait `Dest`. - pub cast_rc: CastRcFn<Dest>, - - /// Casts an `Arc` holding a type or trait for `Any + Sync + Send + 'static` to - /// another `Arc` holding a type or trait for `Dest`. - pub opt_cast_arc: Option<CastArcFn<Dest>>, -} - -impl<Dest: ?Sized + 'static> Caster<Dest> -{ - pub fn new(cast_box: CastBoxFn<Dest>, cast_rc: CastRcFn<Dest>) -> Caster<Dest> - { - Caster::<Dest> { - cast_box, - cast_rc, - opt_cast_arc: None, - } - } - - #[allow(clippy::similar_names)] - pub fn new_sync( - cast_box: CastBoxFn<Dest>, - cast_rc: CastRcFn<Dest>, - cast_arc: CastArcFn<Dest>, - ) -> Caster<Dest> - { - Caster::<Dest> { - cast_box, - cast_rc, - opt_cast_arc: Some(cast_arc), - } - } -} - -#[derive(Debug, thiserror::Error)] -pub enum CasterError -{ - #[error("Failed to cast Box")] - CastBoxFailed, - - #[error("Failed to cast Rc")] - CastRcFailed, - - #[error("Failed to cast Arc")] - CastArcFailed, -} - -/// Returns a `Caster<Dest>` from a concrete type with the id `type_id` to a type or trait -/// `Dest`. -fn get_caster<Dest: ?Sized + 'static>( - type_id: TypeId, -) -> Result<&'static Caster<Dest>, GetCasterError> -{ - let any_caster = CASTER_MAP - .get(&(type_id, TypeId::of::<Caster<Dest>>())) - .ok_or(GetCasterError::NotFound)?; - - any_caster - .downcast_ref::<Caster<Dest>>() - .ok_or(GetCasterError::DowncastFailed) -} - -#[derive(Debug, thiserror::Error)] -pub enum GetCasterError -{ - #[error("Caster not found")] - NotFound, - - #[error("Failed to downcast caster")] - DowncastFailed, -} - -/// `CastFrom` must be extended by a trait that wants to allow for casting into another -/// trait. -/// -/// It is used for obtaining a trait object for [`Any`] from a trait object for its -/// sub-trait, and blanket implemented for all `Sized + Any + 'static` types. -/// -/// # Examples -/// ```ignore -/// trait Source: CastFrom { -/// ... -/// } -/// ``` -pub trait CastFrom: Any + 'static -{ - /// Returns a `Box` of `Any`, which is backed by the type implementing this trait. - fn box_any(self: Box<Self>) -> Box<dyn Any>; - - /// Returns an `Rc` of `Any`, which is backed by the type implementing this trait. - fn rc_any(self: Rc<Self>) -> Rc<dyn Any>; -} - -/// `CastFromSync` must be extended by a trait that is `Any + Sync + Send + 'static` -/// and wants to allow for casting into another trait behind references and smart pointers -/// especially including `Arc`. -/// -/// It is used for obtaining a trait object for [`Any + Sync + Send + 'static`] from an -/// object for its sub-trait, and blanket implemented for all `Sized + Sync + Send + -/// 'static` types. -/// -/// # Examples -/// ```ignore -/// trait Source: CastFromSync { -/// ... -/// } -/// ``` -pub trait CastFromSync: CastFrom + Sync + Send + 'static -{ - fn arc_any(self: Arc<Self>) -> Arc<dyn Any + Sync + Send + 'static>; -} - -impl<Source: Sized + Any + 'static> CastFrom for Source -{ - fn box_any(self: Box<Self>) -> Box<dyn Any> - { - self - } - - fn rc_any(self: Rc<Self>) -> Rc<dyn Any> - { - self - } -} - -impl CastFrom for dyn Any + 'static -{ - fn box_any(self: Box<Self>) -> Box<dyn Any> - { - self - } - - fn rc_any(self: Rc<Self>) -> Rc<dyn Any> - { - self - } -} - -impl<Source: Sized + Sync + Send + 'static> CastFromSync for Source -{ - fn arc_any(self: Arc<Self>) -> Arc<dyn Any + Sync + Send + 'static> - { - self - } -} - -impl CastFrom for dyn Any + Sync + Send + 'static -{ - fn box_any(self: Box<Self>) -> Box<dyn Any> - { - self - } - - fn rc_any(self: Rc<Self>) -> Rc<dyn Any> - { - self - } -} - -impl CastFromSync for dyn Any + Sync + Send + 'static -{ - fn arc_any(self: Arc<Self>) -> Arc<dyn Any + Sync + Send + 'static> - { - self - } -} - -#[cfg(test)] -mod tests -{ - use std::any::TypeId; - use std::fmt::Debug; - - use linkme::distributed_slice; - - use super::*; - use crate::test_utils::subjects; - - #[distributed_slice(super::CASTERS)] - static TEST_CASTER: fn() -> (TypeId, BoxedCaster) = create_test_caster; - - fn create_test_caster() -> (TypeId, BoxedCaster) - { - let type_id = TypeId::of::<subjects::Ninja>(); - - let caster = Box::new(Caster::<dyn Debug> { - cast_box: |from| { - let concrete = from - .downcast::<subjects::Ninja>() - .map_err(|_| CasterError::CastBoxFailed)?; - - Ok(concrete as Box<dyn Debug>) - }, - cast_rc: |from| { - let concrete = from - .downcast::<subjects::Ninja>() - .map_err(|_| CasterError::CastRcFailed)?; - - Ok(concrete as Rc<dyn Debug>) - }, - opt_cast_arc: Some(|from| { - let concrete = from - .downcast::<subjects::Ninja>() - .map_err(|_| CasterError::CastArcFailed)?; - - Ok(concrete as Arc<dyn Debug>) - }), - }); - (type_id, caster) - } -} diff --git a/src/libs/mod.rs b/src/libs/mod.rs deleted file mode 100644 index 8d5583d..0000000 --- a/src/libs/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod intertrait; - -pub extern crate linkme; |