blob: b7fb08f08c9d49e847583631b1a38468b1020bc6 [file] [log] [blame]
Mårten Kongstad00cf0452023-05-26 16:48:01 +02001/*
2 * Copyright (C) 2023 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mårten Kongstad066575b2023-06-07 16:29:25 +020017use anyhow::{ensure, Result};
18
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020019pub fn is_valid_name_ident(s: &str) -> bool {
Mårten Kongstadd18c9782023-06-13 13:30:58 +020020 // Identifiers must match [a-z][a-z0-9_]*, except consecutive underscores are not allowed
21 if s.contains("__") {
22 return false;
23 }
Mårten Kongstad00cf0452023-05-26 16:48:01 +020024 let mut chars = s.chars();
25 let Some(first) = chars.next() else {
26 return false;
27 };
28 if !first.is_ascii_lowercase() {
29 return false;
30 }
31 chars.all(|ch| ch.is_ascii_lowercase() || ch.is_ascii_digit() || ch == '_')
32}
33
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020034pub fn is_valid_package_ident(s: &str) -> bool {
Mårten Kongstad19776d12023-06-29 10:38:02 +020035 if !s.contains('.') {
36 return false;
37 }
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020038 s.split('.').all(is_valid_name_ident)
39}
40
Mårten Kongstad066575b2023-06-07 16:29:25 +020041pub fn create_device_config_ident(package: &str, flag_name: &str) -> Result<String> {
42 ensure!(is_valid_package_ident(package), "bad package");
Mårten Kongstadc0d618c2023-06-29 10:18:20 +020043 ensure!(is_valid_name_ident(flag_name), "bad flag name");
Mårten Kongstad066575b2023-06-07 16:29:25 +020044 Ok(format!("{}.{}", package, flag_name))
45}
46
Mårten Kongstad00cf0452023-05-26 16:48:01 +020047#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020052 fn test_is_valid_name_ident() {
53 assert!(is_valid_name_ident("foo"));
54 assert!(is_valid_name_ident("foo_bar_123"));
Mårten Kongstadd18c9782023-06-13 13:30:58 +020055 assert!(is_valid_name_ident("foo_"));
Mårten Kongstad00cf0452023-05-26 16:48:01 +020056
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020057 assert!(!is_valid_name_ident(""));
58 assert!(!is_valid_name_ident("123_foo"));
59 assert!(!is_valid_name_ident("foo-bar"));
60 assert!(!is_valid_name_ident("foo-b\u{00e5}r"));
Mårten Kongstadd18c9782023-06-13 13:30:58 +020061 assert!(!is_valid_name_ident("foo__bar"));
62 assert!(!is_valid_name_ident("_foo"));
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020063 }
64
65 #[test]
66 fn test_is_valid_package_ident() {
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020067 assert!(is_valid_package_ident("foo.bar"));
Mårten Kongstad19776d12023-06-29 10:38:02 +020068 assert!(is_valid_package_ident("foo.bar_baz"));
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020069 assert!(is_valid_package_ident("foo.bar.a123"));
70
Mårten Kongstad19776d12023-06-29 10:38:02 +020071 assert!(!is_valid_package_ident("foo_bar_123"));
72 assert!(!is_valid_package_ident("foo"));
Mårten Kongstad60ee8a62023-06-29 10:01:52 +020073 assert!(!is_valid_package_ident("foo._bar"));
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020074 assert!(!is_valid_package_ident(""));
75 assert!(!is_valid_package_ident("123_foo"));
76 assert!(!is_valid_package_ident("foo-bar"));
77 assert!(!is_valid_package_ident("foo-b\u{00e5}r"));
78 assert!(!is_valid_package_ident("foo.bar.123"));
79 assert!(!is_valid_package_ident(".foo.bar"));
80 assert!(!is_valid_package_ident("foo.bar."));
81 assert!(!is_valid_package_ident("."));
Mårten Kongstad19776d12023-06-29 10:38:02 +020082 assert!(!is_valid_package_ident(".."));
Mårten Kongstadfbd71e22023-05-31 13:29:35 +020083 assert!(!is_valid_package_ident("foo..bar"));
Mårten Kongstadd18c9782023-06-13 13:30:58 +020084 assert!(!is_valid_package_ident("foo.__bar"));
Mårten Kongstad00cf0452023-05-26 16:48:01 +020085 }
Mårten Kongstad066575b2023-06-07 16:29:25 +020086
87 #[test]
88 fn test_create_device_config_ident() {
89 assert_eq!(
90 "com.foo.bar.some_flag",
91 create_device_config_ident("com.foo.bar", "some_flag").unwrap()
92 );
93 }
Mårten Kongstad00cf0452023-05-26 16:48:01 +020094}