1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
use codec::{Decode, Encode};
use sp_core::RuntimeDebug;
use sp_std::vec::Vec;
#[derive(Eq, RuntimeDebug, Clone)]
pub enum RuntimeString {
Borrowed(&'static str),
#[cfg(feature = "std")]
Owned(String),
#[cfg(not(feature = "std"))]
Owned(Vec<u8>),
}
impl scale_info::TypeInfo for RuntimeString {
type Identity = str;
fn type_info() -> scale_info::Type {
Self::Identity::type_info()
}
}
#[macro_export]
macro_rules! format_runtime_string {
($($args:tt)*) => {{
#[cfg(feature = "std")]
{
sp_runtime::RuntimeString::Owned(format!($($args)*))
}
#[cfg(not(feature = "std"))]
{
sp_runtime::RuntimeString::Owned(sp_std::alloc::format!($($args)*).as_bytes().to_vec())
}
}};
}
impl From<&'static str> for RuntimeString {
fn from(data: &'static str) -> Self {
Self::Borrowed(data)
}
}
#[cfg(feature = "std")]
impl From<RuntimeString> for String {
fn from(string: RuntimeString) -> Self {
match string {
RuntimeString::Borrowed(data) => data.to_owned(),
RuntimeString::Owned(data) => data,
}
}
}
impl Default for RuntimeString {
fn default() -> Self {
Self::Borrowed(Default::default())
}
}
impl PartialEq for RuntimeString {
fn eq(&self, other: &Self) -> bool {
self.as_ref() == other.as_ref()
}
}
impl AsRef<[u8]> for RuntimeString {
fn as_ref(&self) -> &[u8] {
match self {
Self::Borrowed(val) => val.as_ref(),
Self::Owned(val) => val.as_ref(),
}
}
}
#[cfg(feature = "std")]
impl std::ops::Deref for RuntimeString {
type Target = str;
fn deref(&self) -> &str {
match self {
Self::Borrowed(val) => val,
Self::Owned(val) => val,
}
}
}
impl Encode for RuntimeString {
fn encode(&self) -> Vec<u8> {
match self {
Self::Borrowed(val) => val.encode(),
Self::Owned(val) => val.encode(),
}
}
}
impl Decode for RuntimeString {
fn decode<I: codec::Input>(value: &mut I) -> Result<Self, codec::Error> {
Decode::decode(value).map(Self::Owned)
}
}
#[cfg(feature = "std")]
impl std::fmt::Display for RuntimeString {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Self::Borrowed(val) => write!(f, "{}", val),
Self::Owned(val) => write!(f, "{}", val),
}
}
}
#[cfg(feature = "std")]
impl serde::Serialize for RuntimeString {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::Borrowed(val) => val.serialize(serializer),
Self::Owned(val) => val.serialize(serializer),
}
}
}
#[cfg(feature = "std")]
impl<'de> serde::Deserialize<'de> for RuntimeString {
fn deserialize<D: serde::Deserializer<'de>>(de: D) -> Result<Self, D::Error> {
String::deserialize(de).map(Self::Owned)
}
}
#[macro_export]
macro_rules! create_runtime_str {
( $y:expr ) => {{
$crate::RuntimeString::Borrowed($y)
}};
}