blob: 53fbdff406eacc7587c98e93b227f3877d0319ce [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use std::fmt;
use serde::{Deserialize, Serialize};
use crate::common::{CpuArchitecture, ElementType};
use crate::json::JsonObject;
#[derive(Serialize, Deserialize, Debug, Default)]
#[serde(deny_unknown_fields)]
pub struct Architectures {
pub host: String,
pub target: Vec<CpuArchitecture>,
}
#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone, PartialOrd, Ord)]
#[serde(deny_unknown_fields)]
pub struct Part {
pub meta: String,
#[serde(rename = "type")]
pub kind: ElementType,
}
impl fmt::Display for Part {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}[{:?}]", self.meta, self.kind)
}
}
#[derive(Serialize, Deserialize, Debug, Default)]
#[serde(deny_unknown_fields)]
pub struct Manifest {
pub arch: Architectures,
pub schema_version: String,
pub id: String,
pub parts: Vec<Part>,
pub root: String,
}
impl JsonObject for Manifest {
fn get_schema() -> &'static str {
include_str!("../manifest.json")
}
}
#[cfg(test)]
mod tests {
use super::Manifest;
test_validation! {
name = test_validation,
kind = Manifest,
data = r#"
{
"arch": {
"host": "x86_128-fuchsia",
"target": [
"x64"
]
},
"parts": [
{
"meta": "pkg/foo/meta.json",
"type": "cc_source_library"
}
],
"id": "foobarblah",
"root": "..",
"schema_version": "314"
}
"#,
valid = true,
}
test_validation! {
name = test_validation_invalid,
kind = Manifest,
data = r#"
{
"arch": {
"host": "x86_128-fuchsia",
"target": [
"x64"
]
},
"parts": [],
"id": "foobarblah",
"root": "..",
"schema_version": "314"
}
"#,
// Parts are empty.
valid = false,
}
}