metrique_core/
namestyle.rs1use std::marker::PhantomData;
7
8use crate::concat::{Concatenated, EmptyConstStr, MaybeConstStr};
9
10pub(crate) mod private {
11 pub trait NameStyleInternal {}
13}
14
15pub trait NameStyle: private::NameStyleInternal {
21 #[doc(hidden)]
22 type KebabCase: NameStyle;
23
24 #[doc(hidden)]
25 type PascalCase: NameStyle;
26
27 #[doc(hidden)]
28 type SnakeCase: NameStyle;
29
30 #[doc(hidden)]
31 type AppendPrefix<T: MaybeConstStr>: NameStyle;
32
33 #[doc(hidden)]
35 type Inflect<ID: MaybeConstStr, PASCAL: MaybeConstStr, SNAKE: MaybeConstStr, KEBAB: MaybeConstStr>: MaybeConstStr;
36
37 #[doc(hidden)]
39 type InflectAffix<ID: MaybeConstStr, PASCAL: MaybeConstStr, SNAKE: MaybeConstStr, KEBAB: MaybeConstStr>: MaybeConstStr;
40}
41
42pub struct Identity<PREFIX: MaybeConstStr = EmptyConstStr>(PhantomData<PREFIX>);
44impl<PREFIX: MaybeConstStr> private::NameStyleInternal for Identity<PREFIX> {}
45impl<PREFIX: MaybeConstStr> NameStyle for Identity<PREFIX> {
46 type KebabCase = KebabCase<PREFIX>;
47 type PascalCase = PascalCase<PREFIX>;
48 type SnakeCase = SnakeCase<PREFIX>;
49 type AppendPrefix<P: MaybeConstStr> = Identity<Concatenated<PREFIX, P>>;
50 type Inflect<
51 ID: MaybeConstStr,
52 PASCAL: MaybeConstStr,
53 SNAKE: MaybeConstStr,
54 KEBAB: MaybeConstStr,
55 > = Concatenated<PREFIX, ID>;
56 type InflectAffix<
57 ID: MaybeConstStr,
58 PASCAL: MaybeConstStr,
59 SNAKE: MaybeConstStr,
60 KEBAB: MaybeConstStr,
61 > = ID;
62}
63
64pub struct PascalCase<PREFIX: MaybeConstStr = EmptyConstStr>(PhantomData<PREFIX>);
66impl<PREFIX: MaybeConstStr> private::NameStyleInternal for PascalCase<PREFIX> {}
67impl<PREFIX: MaybeConstStr> NameStyle for PascalCase<PREFIX> {
68 type KebabCase = KebabCase<PREFIX>;
69 type PascalCase = PascalCase<PREFIX>;
70 type SnakeCase = SnakeCase<PREFIX>;
71 type AppendPrefix<P: MaybeConstStr> = PascalCase<Concatenated<PREFIX, P>>;
72 type Inflect<
73 ID: MaybeConstStr,
74 PASCAL: MaybeConstStr,
75 SNAKE: MaybeConstStr,
76 KEBAB: MaybeConstStr,
77 > = Concatenated<PREFIX, PASCAL>;
78 type InflectAffix<
79 ID: MaybeConstStr,
80 PASCAL: MaybeConstStr,
81 SNAKE: MaybeConstStr,
82 KEBAB: MaybeConstStr,
83 > = PASCAL;
84}
85
86pub struct SnakeCase<PREFIX: MaybeConstStr = EmptyConstStr>(PhantomData<PREFIX>);
88impl<PREFIX: MaybeConstStr> private::NameStyleInternal for SnakeCase<PREFIX> {}
89impl<PREFIX: MaybeConstStr> NameStyle for SnakeCase<PREFIX> {
90 type KebabCase = KebabCase<PREFIX>;
91 type PascalCase = PascalCase<PREFIX>;
92 type SnakeCase = SnakeCase<PREFIX>;
93 type AppendPrefix<P: MaybeConstStr> = SnakeCase<Concatenated<PREFIX, P>>;
94 type Inflect<
95 ID: MaybeConstStr,
96 PASCAL: MaybeConstStr,
97 SNAKE: MaybeConstStr,
98 KEBAB: MaybeConstStr,
99 > = Concatenated<PREFIX, SNAKE>;
100 type InflectAffix<
101 ID: MaybeConstStr,
102 PASCAL: MaybeConstStr,
103 SNAKE: MaybeConstStr,
104 KEBAB: MaybeConstStr,
105 > = SNAKE;
106}
107
108pub struct KebabCase<PREFIX: MaybeConstStr = EmptyConstStr>(PhantomData<PREFIX>);
110impl<PREFIX: MaybeConstStr> private::NameStyleInternal for KebabCase<PREFIX> {}
111impl<PREFIX: MaybeConstStr> NameStyle for KebabCase<PREFIX> {
112 type KebabCase = KebabCase<PREFIX>;
113 type PascalCase = PascalCase<PREFIX>;
114 type SnakeCase = SnakeCase<PREFIX>;
115 type AppendPrefix<P: MaybeConstStr> = KebabCase<Concatenated<PREFIX, P>>;
116 type Inflect<
117 ID: MaybeConstStr,
118 PASCAL: MaybeConstStr,
119 SNAKE: MaybeConstStr,
120 KEBAB: MaybeConstStr,
121 > = Concatenated<PREFIX, KEBAB>;
122 type InflectAffix<
123 ID: MaybeConstStr,
124 PASCAL: MaybeConstStr,
125 SNAKE: MaybeConstStr,
126 KEBAB: MaybeConstStr,
127 > = KEBAB;
128}
129
130#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
135#[non_exhaustive]
136pub enum DynamicNameStyle {
137 #[default]
139 Identity,
140 PascalCase,
142 SnakeCase,
144 KebabCase,
146}