mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-07-08 10:25:20 +02:00
ANDROID: rust: Support arrays in target JSON
Some configurations, such as enabled sanitizers, are arrays This is Android specific because Rust KCFI is incomplete, and we are using the binder driver as a staging ground to fix it. This patch is intended to go upstream once the compiler behaves properly. Signed-off-by: Matthew Maurer <mmaurer@google.com> Bug: 316623888 Change-Id: I4cf494f36a07a685f6856aef4a361772baedde2e
This commit is contained in:
parent
4085063afb
commit
2b93c38ece
|
@ -20,12 +20,24 @@ enum Value {
|
||||||
Boolean(bool),
|
Boolean(bool),
|
||||||
Number(i32),
|
Number(i32),
|
||||||
String(String),
|
String(String),
|
||||||
|
Array(Vec<Value>),
|
||||||
Object(Object),
|
Object(Object),
|
||||||
}
|
}
|
||||||
|
|
||||||
type Object = Vec<(String, Value)>;
|
type Object = Vec<(String, Value)>;
|
||||||
|
|
||||||
/// Minimal "almost JSON" generator (e.g. no `null`s, no arrays, no escaping),
|
fn comma_sep<T>(seq: &[T], formatter: &mut Formatter<'_>, f: impl Fn(&mut Formatter<'_>, &T) -> Result) -> Result {
|
||||||
|
if let [ref rest @ .., ref last] = seq[..] {
|
||||||
|
for v in rest {
|
||||||
|
f(formatter, v)?;
|
||||||
|
formatter.write_str(",")?;
|
||||||
|
}
|
||||||
|
f(formatter, last)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Minimal "almost JSON" generator (e.g. no `null`s, no escaping),
|
||||||
/// enough for this purpose.
|
/// enough for this purpose.
|
||||||
impl Display for Value {
|
impl Display for Value {
|
||||||
fn fmt(&self, formatter: &mut Formatter<'_>) -> Result {
|
fn fmt(&self, formatter: &mut Formatter<'_>) -> Result {
|
||||||
|
@ -33,14 +45,15 @@ impl Display for Value {
|
||||||
Value::Boolean(boolean) => write!(formatter, "{}", boolean),
|
Value::Boolean(boolean) => write!(formatter, "{}", boolean),
|
||||||
Value::Number(number) => write!(formatter, "{}", number),
|
Value::Number(number) => write!(formatter, "{}", number),
|
||||||
Value::String(string) => write!(formatter, "\"{}\"", string),
|
Value::String(string) => write!(formatter, "\"{}\"", string),
|
||||||
|
Value::Array(values) => {
|
||||||
|
formatter.write_str("[")?;
|
||||||
|
comma_sep(&values[..], formatter, |formatter, v| v.fmt(formatter))?;
|
||||||
|
formatter.write_str("]")
|
||||||
|
}
|
||||||
Value::Object(object) => {
|
Value::Object(object) => {
|
||||||
formatter.write_str("{")?;
|
formatter.write_str("{")?;
|
||||||
if let [ref rest @ .., ref last] = object[..] {
|
comma_sep(&object[..], formatter, |formatter, v|
|
||||||
for (key, value) in rest {
|
write!(formatter, "\"{}\": {}", v.0, v.1))?;
|
||||||
write!(formatter, "\"{}\": {},", key, value)?;
|
|
||||||
}
|
|
||||||
write!(formatter, "\"{}\": {}", last.0, last.1)?;
|
|
||||||
}
|
|
||||||
formatter.write_str("}")
|
formatter.write_str("}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,9 +90,9 @@ impl Push<String> for TargetSpec {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Push<&str> for TargetSpec {
|
impl <T: Into<Value>, const N: usize> From<[T; N]> for Value {
|
||||||
fn push(&mut self, key: &str, value: &str) {
|
fn from(i: [T; N]) -> Self {
|
||||||
self.push(key, value.to_string());
|
Self::Array(i.into_iter().map(|v| v.into()).collect())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user