From 0fb9b94e3f0fdb998e6a1ca363cf2362f0f07833 Mon Sep 17 00:00:00 2001 From: Andrew Jones Date: Tue, 13 Apr 2021 15:17:47 +0100 Subject: [PATCH] Implement `TypeInfo` for `Cow` (#84) * Implement TypeInfo for Cow * Fmt * Fix ui tests --- src/impls.rs | 18 +++++++++++++++++ src/prelude.rs | 2 ++ src/tests.rs | 20 ++++++++++++------- .../ui/fail_with_invalid_codec_attrs.stderr | 18 ++++++++--------- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/impls.rs b/src/impls.rs index 1ac66de5..e15946e3 100644 --- a/src/impls.rs +++ b/src/impls.rs @@ -13,6 +13,10 @@ // limitations under the License. use crate::prelude::{ + borrow::{ + Cow, + ToOwned, + }, boxed::Box, collections::BTreeMap, marker::PhantomData, @@ -152,6 +156,20 @@ where } } +impl TypeInfo for Cow<'static, T> +where + T: ToOwned + TypeInfo + ?Sized + 'static, +{ + type Identity = Self; + + fn type_info() -> Type { + Type::builder() + .path(Path::prelude("Cow")) + .type_params(tuple_meta_type!(T)) + .composite(Fields::unnamed().field_of::("T")) + } +} + impl TypeInfo for BTreeMap where K: TypeInfo + 'static, diff --git a/src/prelude.rs b/src/prelude.rs index 0e8c4fe5..0347402f 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -25,6 +25,7 @@ cfg_if! { if #[cfg(feature = "std")] { pub use std::{ any, + borrow, boxed, cmp, collections, @@ -39,6 +40,7 @@ cfg_if! { }; } else { pub use alloc::{ + borrow, boxed, collections, format, diff --git a/src/tests.rs b/src/tests.rs index fbbf4bea..3fdd3bc4 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -14,18 +14,17 @@ use crate::{ build::*, + prelude::{ + borrow::Cow, + boxed::Box, + string::String, + vec, + }, *, }; use core::marker::PhantomData; use scale::Compact; -#[cfg(not(feature = "std"))] -use alloc::{ - boxed::Box, - string::String, - vec, -}; - fn assert_type(expected: E) where T: TypeInfo + ?Sized, @@ -76,6 +75,13 @@ fn prelude_items() { ) ); assert_type!(PhantomData, TypeDefPhantom::new(meta_type::())); + assert_type!( + Cow, + Type::builder() + .path(Path::prelude("Cow")) + .type_params(tuple_meta_type!(u128)) + .composite(Fields::unnamed().field_of::("T")) + ); } #[test] diff --git a/test_suite/tests/ui/fail_with_invalid_codec_attrs.stderr b/test_suite/tests/ui/fail_with_invalid_codec_attrs.stderr index 2fa7f609..96a1a344 100644 --- a/test_suite/tests/ui/fail_with_invalid_codec_attrs.stderr +++ b/test_suite/tests/ui/fail_with_invalid_codec_attrs.stderr @@ -10,6 +10,12 @@ error: Invalid attribute on field, only `#[codec(skip)]`, `#[codec(compact)]` an 13 | Thing(#[codec(index = 3)] u32), | ^^^^^^^^^ +error: expected literal + --> $DIR/fail_with_invalid_codec_attrs.rs:18:21 + | +18 | #[codec(index = a)] + | ^ + error: proc-macro derive panicked --> $DIR/fail_with_invalid_codec_attrs.rs:16:18 | @@ -19,10 +25,10 @@ error: proc-macro derive panicked = help: message: scale-info: Bad index in `#[codec(index = …)]`, see `parity-scale-codec` error: Error("expected literal") error: expected literal - --> $DIR/fail_with_invalid_codec_attrs.rs:18:21 + --> $DIR/fail_with_invalid_codec_attrs.rs:24:25 | -18 | #[codec(index = a)] - | ^ +24 | #[codec(encode_as = u8, compact)] + | ^^ error: proc-macro derive panicked --> $DIR/fail_with_invalid_codec_attrs.rs:22:18 @@ -31,9 +37,3 @@ error: proc-macro derive panicked | ^^^^^^^^ | = help: message: scale-info: Bad index in `#[codec(index = …)]`, see `parity-scale-codec` error: Error("expected literal") - -error: expected literal - --> $DIR/fail_with_invalid_codec_attrs.rs:24:25 - | -24 | #[codec(encode_as = u8, compact)] - | ^^