Move parsers and formatters into rustutils library.
This makes them easier to find, and should save some compile time.
Bug: 270547306
Test: atest sysprop_test
Change-Id: I72a57d2b4e4f9b3d2249748387f25e99a3b77889
diff --git a/RustGen.cpp b/RustGen.cpp
index 0494ece..f113223 100644
--- a/RustGen.cpp
+++ b/RustGen.cpp
@@ -31,124 +31,6 @@
namespace {
-constexpr const char* kParsersAndFormatters = R"(//! Parsers and formatters.
-//!
-//! This code must only be used in the system properties generate code.
-//!
-//! This is autogenerated code. DO NOT EDIT!
-
-use std::str::FromStr;
-use std::string::ToString;
-
-#[allow(missing_docs)]
-pub type Result<T> = std::result::Result<T, String>;
-
-// Parsers.
-
-#[allow(dead_code,missing_docs)]
-pub fn parse<T: FromStr>(s: &str) -> Result<T> {
- s.parse::<T>().map_err(|_| format!("Can't convert '{}' to '{}'.",
- s, std::any::type_name::<T>()))
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn parse_bool(s: &str) -> Result<bool> {
- match s {
- "1" | "true" => Ok(true),
- "0" | "false" => Ok(false),
- _ => Err(format!("Can't convert '{}' to 'bool'.", s)),
- }
-}
-
-fn parse_list_with<T, F>(s: &str, f: F) -> Result<Vec<T>>
-where F: Fn(&str) -> Result<T> {
-
- let mut result = Vec::new();
- if s.is_empty() { return Ok(result); }
-
- let mut chars = s.chars();
- let mut current = chars.next();
- while current.is_some() {
- // Extract token.
- let mut token = String::with_capacity(s.len());
- while let Some(value) = current {
- if value == ',' { break; }
- if value == '\\' {
- current = chars.next()
- }
- if let Some(value) = current {
- token.push(value);
- }
- current = chars.next();
- }
- // Parse token.
- result.push(f(token.as_str())?);
- current = chars.next()
- }
-
- Ok(result)
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn parse_list<T: FromStr>(s: &str) -> Result<Vec<T>> {
- parse_list_with(s, parse)
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn parse_bool_list(s: &str) -> Result<Vec<bool>> {
- parse_list_with(s, parse_bool)
-}
-
-// Formatters.
-
-#[allow(dead_code,missing_docs)]
-pub fn format<T: ToString>(v: &T) -> String {
- v.to_string()
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn format_bool(v: &bool) -> String {
- if *v {
- return "true".into();
- }
- "false".into()
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn format_bool_as_int(v: &bool) -> String {
- if *v {
- return "1".into();
- }
- "0".into()
-}
-
-fn format_list_with<T, F>(v: &[T], f: F) -> String
-where F: Fn(&T) -> String {
- let mut result = String::new();
- for item in v {
- let formatted = f(item);
- result.push_str(formatted.as_str());
- result.push(',');
- }
- result.pop();
- result
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn format_list<T: ToString>(v: &[T]) -> String {
- format_list_with(v, format)
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn format_bool_list(v: &[bool]) -> String {
- format_list_with(v, format_bool)
-}
-
-#[allow(dead_code,missing_docs)]
-pub fn format_bool_list_as_int(v: &[bool]) -> String {
- format_list_with(v, format_bool_as_int)
-})";
-
constexpr const char* kDocs = R"(//! Autogenerated system properties.
//!
//! This is autogenerated crate. The crate contains methods for easy access to
@@ -156,8 +38,7 @@
constexpr const char* kRustFileImports = R"(use std::fmt;
use rustutils::system_properties;
-
-mod gen_parsers_and_formatters;)";
+use rustutils::system_properties::parsers_formatters;)";
constexpr const char* kIndent = " ";
@@ -276,7 +157,7 @@
std::string GetTypeParser(const sysprop::Property& prop) {
switch (prop.type()) {
case sysprop::Boolean:
- return "gen_parsers_and_formatters::parse_bool";
+ return "parsers_formatters::parse_bool";
case sysprop::Integer:
case sysprop::UInt:
case sysprop::Long:
@@ -284,9 +165,9 @@
case sysprop::Double:
case sysprop::String:
case sysprop::Enum:
- return "gen_parsers_and_formatters::parse";
+ return "parsers_formatters::parse";
case sysprop::BooleanList:
- return "gen_parsers_and_formatters::parse_bool_list";
+ return "parsers_formatters::parse_bool_list";
case sysprop::IntegerList:
case sysprop::UIntList:
case sysprop::LongList:
@@ -294,7 +175,7 @@
case sysprop::DoubleList:
case sysprop::StringList:
case sysprop::EnumList:
- return "gen_parsers_and_formatters::parse_list";
+ return "parsers_formatters::parse_list";
default:
__builtin_unreachable();
}
@@ -304,9 +185,9 @@
switch (prop.type()) {
case sysprop::Boolean:
if (prop.integer_as_bool()) {
- return "gen_parsers_and_formatters::format_bool_as_int";
+ return "parsers_formatters::format_bool_as_int";
}
- return "gen_parsers_and_formatters::format_bool";
+ return "parsers_formatters::format_bool";
case sysprop::String:
case sysprop::Integer:
case sysprop::UInt:
@@ -314,12 +195,12 @@
case sysprop::ULong:
case sysprop::Double:
case sysprop::Enum:
- return "gen_parsers_and_formatters::format";
+ return "parsers_formatters::format";
case sysprop::BooleanList:
if (prop.integer_as_bool()) {
- return "gen_parsers_and_formatters::format_bool_list_as_int";
+ return "parsers_formatters::format_bool_list_as_int";
}
- return "gen_parsers_and_formatters::format_bool_list";
+ return "parsers_formatters::format_bool_list";
case sysprop::IntegerList:
case sysprop::UIntList:
case sysprop::LongList:
@@ -327,7 +208,7 @@
case sysprop::DoubleList:
case sysprop::StringList:
case sysprop::EnumList:
- return "gen_parsers_and_formatters::format_list";
+ return "parsers_formatters::format_list";
default:
__builtin_unreachable();
}
@@ -506,11 +387,5 @@
return ErrnoErrorf("Writing generated rust lib to {} failed", lib_path);
}
- std::string parsers_path = rust_output_dir + "/gen_parsers_and_formatters.rs";
- std::string parsers_result = std::string(kParsersAndFormatters);
- if (!android::base::WriteStringToFile(parsers_result, parsers_path)) {
- return ErrnoErrorf("Writing generated rust lib to {} failed", parsers_path);
- }
-
return {};
}
diff --git a/tests/RustGenTest.cpp b/tests/RustGenTest.cpp
index 79c088f..606af00 100644
--- a/tests/RustGenTest.cpp
+++ b/tests/RustGenTest.cpp
@@ -108,8 +108,7 @@
use std::fmt;
use rustutils::system_properties;
-
-mod gen_parsers_and_formatters;
+use rustutils::system_properties::parsers_formatters;
/// Errors this crate could generate.
#[derive(Debug)]
@@ -142,7 +141,7 @@
pub fn test_int() -> Result<Option<i32>> {
let result = match system_properties::read("android.test_int") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -150,7 +149,7 @@
/// Sets the value of the property 'android.test_int', returns 'Ok' if successful.
pub fn set_test_int(v: i32) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android.test_int", value.as_str()).map_err(SysPropError::SetError)
}
@@ -158,14 +157,14 @@
pub fn test_string() -> Result<Option<String>> {
let result = match system_properties::read("android.test.string") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
if result.is_ok() { return result; }
log::debug!("Failed to fetch the original property 'android.test.string' ('{}'), falling back to the legacy one 'legacy.android.test.string'.", result.unwrap_err());
match system_properties::read("legacy.android.test.string") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
}
}
@@ -174,7 +173,7 @@
pub fn test_boo_lea_n() -> Result<Option<bool>> {
let result = match system_properties::read("ro.android.test.b") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_bool(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_bool(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -182,7 +181,7 @@
/// Sets the value of the property 'ro.android.test.b', returns 'Ok' if successful.
pub fn set_test_boo_lea_n(v: bool) -> Result<()> {
- let value = gen_parsers_and_formatters::format_bool(&v);
+ let value = parsers_formatters::format_bool(&v);
system_properties::write("ro.android.test.b", value.as_str()).map_err(SysPropError::SetError)
}
@@ -190,7 +189,7 @@
pub fn android_os_test_long() -> Result<Option<i64>> {
let result = match system_properties::read("android_os_test-long") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -198,7 +197,7 @@
/// Sets the value of the property 'android_os_test-long', returns 'Ok' if successful.
pub fn set_android_os_test_long(v: i64) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android_os_test-long", value.as_str()).map_err(SysPropError::SetError)
}
@@ -206,7 +205,7 @@
pub fn test_list_int() -> Result<Option<Vec<i32>>> {
let result = match system_properties::read("test_list_int") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -214,7 +213,7 @@
/// Sets the value of the property 'test_list_int', returns 'Ok' if successful.
pub fn set_test_list_int(v: &[i32]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("test_list_int", value.as_str()).map_err(SysPropError::SetError)
}
@@ -223,7 +222,7 @@
pub fn test_strlist() -> Result<Option<Vec<String>>> {
let result = match system_properties::read("test_strlist") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -232,7 +231,7 @@
/// Sets the value of the property 'test_strlist', returns 'Ok' if successful.
#[deprecated]
pub fn set_test_strlist(v: &[String]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("test_strlist", value.as_str()).map_err(SysPropError::SetError)
}
@@ -248,8 +247,7 @@
use std::fmt;
use rustutils::system_properties;
-
-mod gen_parsers_and_formatters;
+use rustutils::system_properties::parsers_formatters;
/// Errors this crate could generate.
#[derive(Debug)]
@@ -282,7 +280,7 @@
pub fn test_double() -> Result<Option<f64>> {
let result = match system_properties::read("android.test_double") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -290,7 +288,7 @@
/// Sets the value of the property 'android.test_double', returns 'Ok' if successful.
pub fn set_test_double(v: f64) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android.test_double", value.as_str()).map_err(SysPropError::SetError)
}
@@ -298,7 +296,7 @@
pub fn test_int() -> Result<Option<i32>> {
let result = match system_properties::read("android.test_int") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -306,7 +304,7 @@
/// Sets the value of the property 'android.test_int', returns 'Ok' if successful.
pub fn set_test_int(v: i32) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android.test_int", value.as_str()).map_err(SysPropError::SetError)
}
@@ -314,14 +312,14 @@
pub fn test_string() -> Result<Option<String>> {
let result = match system_properties::read("android.test.string") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
if result.is_ok() { return result; }
log::debug!("Failed to fetch the original property 'android.test.string' ('{}'), falling back to the legacy one 'legacy.android.test.string'.", result.unwrap_err());
match system_properties::read("legacy.android.test.string") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
}
}
@@ -373,7 +371,7 @@
pub fn test_enum() -> Result<Option<TestEnumValues>> {
let result = match system_properties::read("android.test.enum") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -381,7 +379,7 @@
/// Sets the value of the property 'android.test.enum', returns 'Ok' if successful.
pub fn set_test_enum(v: TestEnumValues) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android.test.enum", value.as_str()).map_err(SysPropError::SetError)
}
@@ -389,7 +387,7 @@
pub fn test_boo_lea_n() -> Result<Option<bool>> {
let result = match system_properties::read("ro.android.test.b") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_bool(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_bool(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -397,7 +395,7 @@
/// Sets the value of the property 'ro.android.test.b', returns 'Ok' if successful.
pub fn set_test_boo_lea_n(v: bool) -> Result<()> {
- let value = gen_parsers_and_formatters::format_bool(&v);
+ let value = parsers_formatters::format_bool(&v);
system_properties::write("ro.android.test.b", value.as_str()).map_err(SysPropError::SetError)
}
@@ -405,7 +403,7 @@
pub fn android_os_test_long() -> Result<Option<i64>> {
let result = match system_properties::read("android_os_test-long") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -413,7 +411,7 @@
/// Sets the value of the property 'android_os_test-long', returns 'Ok' if successful.
pub fn set_android_os_test_long(v: i64) -> Result<()> {
- let value = gen_parsers_and_formatters::format(&v);
+ let value = parsers_formatters::format(&v);
system_properties::write("android_os_test-long", value.as_str()).map_err(SysPropError::SetError)
}
@@ -421,7 +419,7 @@
pub fn test_double_list() -> Result<Option<Vec<f64>>> {
let result = match system_properties::read("test_double_list") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -429,7 +427,7 @@
/// Sets the value of the property 'test_double_list', returns 'Ok' if successful.
pub fn set_test_double_list(v: &[f64]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("test_double_list", value.as_str()).map_err(SysPropError::SetError)
}
@@ -437,7 +435,7 @@
pub fn test_list_int() -> Result<Option<Vec<i32>>> {
let result = match system_properties::read("test_list_int") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -445,7 +443,7 @@
/// Sets the value of the property 'test_list_int', returns 'Ok' if successful.
pub fn set_test_list_int(v: &[i32]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("test_list_int", value.as_str()).map_err(SysPropError::SetError)
}
@@ -454,7 +452,7 @@
pub fn test_strlist() -> Result<Option<Vec<String>>> {
let result = match system_properties::read("test_strlist") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -463,7 +461,7 @@
/// Sets the value of the property 'test_strlist', returns 'Ok' if successful.
#[deprecated]
pub fn set_test_strlist(v: &[String]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("test_strlist", value.as_str()).map_err(SysPropError::SetError)
}
@@ -503,7 +501,7 @@
pub fn el() -> Result<Option<Vec<ElValues>>> {
let result = match system_properties::read("el") {
Err(e) => Err(SysPropError::FetchError(e)),
- Ok(Some(val)) => gen_parsers_and_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
+ Ok(Some(val)) => parsers_formatters::parse_list(val.as_str()).map_err(SysPropError::ParseError).map(Some),
Ok(None) => Ok(None),
};
result
@@ -512,7 +510,7 @@
/// Sets the value of the property 'el', returns 'Ok' if successful.
#[deprecated]
pub fn set_el(v: &[ElValues]) -> Result<()> {
- let value = gen_parsers_and_formatters::format_list(v);
+ let value = parsers_formatters::format_list(v);
system_properties::write("el", value.as_str()).map_err(SysPropError::SetError)
}