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}