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)
 }