1 | use super::str_indexing::{pass_range_types, IndexValidity, StrIndexArgs, StrIndexArgsConv}; |
2 | |
3 | pub struct StrSplceArgsConv<T> { |
4 | pub arg: T, |
5 | pub str: &'static str, |
6 | pub insert: &'static str, |
7 | } |
8 | |
9 | #[allow (non_snake_case)] |
10 | pub const fn StrSplceArgsConv<T>( |
11 | str: &'static str, |
12 | arg: T, |
13 | insert: &'static str, |
14 | ) -> StrSplceArgsConv<T> { |
15 | StrSplceArgsConv { str, arg, insert } |
16 | } |
17 | |
18 | pub struct StrSpliceArgs { |
19 | pub str: &'static str, |
20 | pub insert: &'static str, |
21 | pub index_validity: IndexValidity, |
22 | pub used_rstart: usize, |
23 | pub used_rlen: usize, |
24 | pub insert_len: usize, |
25 | pub suffix_len: usize, |
26 | pub out_len: usize, |
27 | } |
28 | |
29 | /// The return value of [`str_splice`](./macro.str_splice.html) |
30 | #[derive (Debug, Copy, Clone, PartialEq, Eq)] |
31 | pub struct SplicedStr { |
32 | /// A string that had `removed` replaced with some other string. |
33 | pub output: &'static str, |
34 | /// The part of the string that was removed. |
35 | pub removed: &'static str, |
36 | } |
37 | |
38 | #[repr (C, packed)] |
39 | pub struct DecomposedString<P, M, S> { |
40 | pub prefix: P, |
41 | pub middle: M, |
42 | pub suffix: S, |
43 | } |
44 | |
45 | macro_rules! define_conversions { |
46 | ( |
47 | $( fn($self:ident, $ty:ty) $block:block )* |
48 | ) => { |
49 | $( |
50 | impl StrSplceArgsConv<$ty> { |
51 | pub const fn conv(self) -> StrSpliceArgs { |
52 | let StrIndexArgs{ |
53 | str, |
54 | index_validity, |
55 | used_rstart, |
56 | used_rend, |
57 | used_rlen, |
58 | } = StrIndexArgsConv{ |
59 | arg: self.arg, |
60 | str: self.str, |
61 | }.conv(); |
62 | |
63 | StrSpliceArgs{ |
64 | str, |
65 | index_validity, |
66 | used_rstart, |
67 | used_rlen, |
68 | insert: self.insert, |
69 | insert_len: self.insert.len(), |
70 | suffix_len: str.len() - used_rend, |
71 | out_len: str.len() - used_rlen + self.insert.len(), |
72 | } |
73 | } |
74 | } |
75 | )* |
76 | }; |
77 | } |
78 | |
79 | pass_range_types! {define_conversions} |
80 | |