inflector/suffix/foreignkey/mod.rs
1use cases::snakecase::to_snake_case;
2
3/// Converts a `&str` to a `foreign_key`
4///
5/// ```
6/// use inflector::suffix::foreignkey::to_foreign_key;
7/// let mock_string: &str = "foo_bar";
8/// let expected_string: String = "foo_bar_id".to_owned();
9/// let asserted_string: String = to_foreign_key(mock_string);
10/// assert!(asserted_string == expected_string);
11///
12/// ```
13/// ```
14/// use inflector::suffix::foreignkey::to_foreign_key;
15/// let mock_string: &str = "Foo bar";
16/// let expected_string: String = "foo_bar_id".to_owned();
17/// let asserted_string: String = to_foreign_key(mock_string);
18/// assert!(asserted_string == expected_string);
19///
20/// ```
21/// ```
22/// use inflector::suffix::foreignkey::to_foreign_key;
23/// let mock_string: &str = "Foo Bar";
24/// let expected_string: String = "foo_bar_id".to_owned();
25/// let asserted_string: String = to_foreign_key(mock_string);
26/// assert!(asserted_string == expected_string);
27///
28/// ```
29/// ```
30/// use inflector::suffix::foreignkey::to_foreign_key;
31/// let mock_string: &str = "Foo::Bar";
32/// let expected_string: String = "bar_id".to_owned();
33/// let asserted_string: String = to_foreign_key(mock_string);
34/// assert!(asserted_string == expected_string);
35///
36/// ```
37/// ```
38/// use inflector::suffix::foreignkey::to_foreign_key;
39/// let mock_string: &str = "Test::Foo::Bar";
40/// let expected_string: String = "bar_id".to_owned();
41/// let asserted_string: String = to_foreign_key(mock_string);
42/// assert!(asserted_string == expected_string);
43///
44/// ```
45/// ```
46/// use inflector::suffix::foreignkey::to_foreign_key;
47/// let mock_string: &str = "FooBar";
48/// let expected_string: String = "foo_bar_id".to_owned();
49/// let asserted_string: String = to_foreign_key(mock_string);
50/// assert!(asserted_string == expected_string);
51///
52/// ```
53/// ```
54/// use inflector::suffix::foreignkey::to_foreign_key;
55/// let mock_string: &str = "fooBar";
56/// let expected_string: String = "foo_bar_id".to_owned();
57/// let asserted_string: String = to_foreign_key(mock_string);
58/// assert!(asserted_string == expected_string);
59///
60/// ```
61/// ```
62/// use inflector::suffix::foreignkey::to_foreign_key;
63/// let mock_string: &str = "fooBar3";
64/// let expected_string: String = "foo_bar_3_id".to_owned();
65/// let asserted_string: String = to_foreign_key(mock_string);
66/// assert!(asserted_string == expected_string);
67///
68/// ```
69pub fn to_foreign_key(non_foreign_key_string: &str) -> String {
70 if non_foreign_key_string.contains("::") {
71 let split_string: Vec<&str> = non_foreign_key_string.split("::").collect();
72 safe_convert(split_string[split_string.len() - 1])
73 } else {
74 safe_convert(non_foreign_key_string)
75 }
76}
77fn safe_convert(safe_string: &str) -> String {
78 let snake_cased: String = to_snake_case(safe_string);
79 if snake_cased.ends_with("_id") {
80 snake_cased
81 } else {
82 format!("{}{}", snake_cased, "_id")
83 }
84}
85
86/// Determines if a `&str` is a `foreign_key`
87///
88/// ```
89/// use inflector::suffix::foreignkey::is_foreign_key;
90/// let mock_string: &str = "Foo bar string that is really really long";
91/// let asserted_bool: bool = is_foreign_key(mock_string);
92/// assert!(asserted_bool == false);
93///
94/// ```
95/// ```
96/// use inflector::suffix::foreignkey::is_foreign_key;
97/// let mock_string: &str = "foo-bar-string-that-is-really-really-long";
98/// let asserted_bool: bool = is_foreign_key(mock_string);
99/// assert!(asserted_bool == false);
100///
101/// ```
102/// ```
103/// use inflector::suffix::foreignkey::is_foreign_key;
104/// let mock_string: &str = "FooBarIsAReallyReallyLongString";
105/// let asserted_bool: bool = is_foreign_key(mock_string);
106/// assert!(asserted_bool == false);
107///
108/// ```
109/// ```
110/// use inflector::suffix::foreignkey::is_foreign_key;
111/// let mock_string: &str = "Foo Bar Is A Really Really Long String";
112/// let asserted_bool: bool = is_foreign_key(mock_string);
113/// assert!(asserted_bool == false);
114///
115/// ```
116/// ```
117/// use inflector::suffix::foreignkey::is_foreign_key;
118/// let mock_string: &str = "fooBarIsAReallyReallyLongString";
119/// let asserted_bool: bool = is_foreign_key(mock_string);
120/// assert!(asserted_bool == false);
121///
122/// ```
123/// ```
124/// use inflector::suffix::foreignkey::is_foreign_key;
125/// let mock_string: &str = "foo_bar_string_that_is_really_really_long";
126/// let asserted_bool: bool = is_foreign_key(mock_string);
127/// assert!(asserted_bool == false);
128///
129/// ```
130/// ```
131/// use inflector::suffix::foreignkey::is_foreign_key;
132/// let mock_string: &str = "foo_bar_string_that_is_really_really_long_id";
133/// let asserted_bool: bool = is_foreign_key(mock_string);
134/// assert!(asserted_bool == true);
135///
136/// ```
137pub fn is_foreign_key(test_string: &str) -> bool {
138 to_foreign_key(test_string.clone()) == test_string
139}