summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-05-30 00:24:11 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-05-30 00:24:11 -0400
commit03fdb87e8f81e35b981a596709c36582a5408732 (patch)
tree236c41ae91d06bbd6fcdf9ce13281b71dec1335d
parent6a1675824c3341b1b91e42a28c4578855810a933 (diff)
ci-web: Serialize results with capnp
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--ci-web/Cargo.toml5
-rw-r--r--ci-web/src/bin/cgi.rs2
-rw-r--r--ci-web/src/bin/gen-commit-summary.rs10
-rw-r--r--ci-web/src/build.rs9
-rw-r--r--ci-web/src/lib.rs108
-rw-r--r--ci-web/src/testresult.capnp19
-rw-r--r--ci-web/src/testresult_capnp.rs570
7 files changed, 706 insertions, 17 deletions
diff --git a/ci-web/Cargo.toml b/ci-web/Cargo.toml
index 4cb9487..85d0e54 100644
--- a/ci-web/Cargo.toml
+++ b/ci-web/Cargo.toml
@@ -2,6 +2,7 @@
name = "ci_cgi"
version = "0.1.0"
edition = "2021"
+build = "src/build.rs"
#[workspace]
#members = ["get-test-job", "ci-cgi"]
@@ -21,3 +22,7 @@ memoize = "0.3.1"
glob = "0.3.0"
clap = { version = "4.0.32", features = ["derive"] }
file-lock = "2.1.6"
+capnp = "0.17.0"
+
+[build-dependencies]
+capnpc = "*"
diff --git a/ci-web/src/bin/cgi.rs b/ci-web/src/bin/cgi.rs
index ab75f24..b31a98f 100644
--- a/ci-web/src/bin/cgi.rs
+++ b/ci-web/src/bin/cgi.rs
@@ -154,7 +154,7 @@ fn ci_log(ci: &Ci) -> cgi::Response {
let subject_len = r.message.find('\n').unwrap_or(r.message.len());
- let duration: usize = r.tests.iter().map(|x| x.1.duration).sum();
+ let duration: u64 = r.tests.iter().map(|x| x.1.duration).sum();
writeln!(&mut out, "<tr>").unwrap();
writeln!(&mut out, "<td> <a href=\"{}?branch={}&commit={}\">{}</a> </td>",
diff --git a/ci-web/src/bin/gen-commit-summary.rs b/ci-web/src/bin/gen-commit-summary.rs
index 6905655..8ec43d1 100644
--- a/ci-web/src/bin/gen-commit-summary.rs
+++ b/ci-web/src/bin/gen-commit-summary.rs
@@ -1,7 +1,6 @@
use std::process;
-use ci_cgi::{ktestrc_read, commitdir_get_results, TestResults};
+use ci_cgi::{ktestrc_read, commit_update_results_from_fs};
use clap::Parser;
-use toml;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
@@ -19,10 +18,5 @@ fn main() {
}
let ktestrc = ktestrc.unwrap();
- let results = TestResults { d: commitdir_get_results(&ktestrc, &args.commit) };
-
- let file_contents = toml::to_string(&results).unwrap();
-
- let commit_summary_fname = ktestrc.output_dir.join(args.commit + ".toml");
- std::fs::write(commit_summary_fname, file_contents).unwrap();
+ commit_update_results_from_fs(&ktestrc, &args.commit);
}
diff --git a/ci-web/src/build.rs b/ci-web/src/build.rs
new file mode 100644
index 0000000..b0977eb
--- /dev/null
+++ b/ci-web/src/build.rs
@@ -0,0 +1,9 @@
+extern crate capnpc;
+
+fn main() {
+ capnpc::CompilerCommand::new()
+ .output_path(".")
+ .file("src/testresult.capnp")
+ .run()
+ .expect("compiling schema");
+}
diff --git a/ci-web/src/lib.rs b/ci-web/src/lib.rs
index 13301f6..5647366 100644
--- a/ci-web/src/lib.rs
+++ b/ci-web/src/lib.rs
@@ -1,10 +1,13 @@
use std::collections::BTreeMap;
use std::fs::read_to_string;
+use std::fs::File;
use std::error::Error;
use std::path::PathBuf;
use serde_derive::{Serialize, Deserialize};
use toml;
+pub mod testresult_capnp;
+
pub fn git_get_commit(repo: &git2::Repository, reference: String) -> Result<git2::Commit, git2::Error> {
let r = repo.revparse_single(&reference);
if let Err(e) = r {
@@ -104,7 +107,7 @@ impl TestStatus {
#[derive(Serialize, Deserialize, Copy, Clone)]
pub struct TestResult {
pub status: TestStatus,
- pub duration: usize,
+ pub duration: u64,
}
pub type TestResultsMap = BTreeMap<String, TestResult>;
@@ -114,14 +117,14 @@ pub struct TestResults {
pub d: TestResultsMap
}
-fn read_test_result(testdir: &std::fs::DirEntry) -> Option<TestResult> {
- Some(TestResult {
- status: TestStatus::from_str(&read_to_string(&testdir.path().join("status")).ok()?),
- duration: read_to_string(&testdir.path().join("duration")).unwrap_or("0".to_string()).parse().unwrap_or(0),
- })
-}
+fn commitdir_get_results_fs(ktestrc: &Ktestrc, commit_id: &String) -> TestResultsMap {
+ fn read_test_result(testdir: &std::fs::DirEntry) -> Option<TestResult> {
+ Some(TestResult {
+ status: TestStatus::from_str(&read_to_string(&testdir.path().join("status")).ok()?),
+ duration: read_to_string(&testdir.path().join("duration")).unwrap_or("0".to_string()).parse().unwrap_or(0),
+ })
+ }
-pub fn commitdir_get_results(ktestrc: &Ktestrc, commit_id: &String) -> TestResultsMap {
let mut results = BTreeMap::new();
let results_dir = ktestrc.output_dir.join(commit_id).read_dir();
@@ -142,3 +145,92 @@ pub fn commitdir_get_results_toml(ktestrc: &Ktestrc, commit_id: &String) -> Resu
let r: TestResults = toml::from_str(&toml)?;
Ok(r.d)
}
+
+fn results_to_toml(ktestrc: &Ktestrc, commit_id: &String, results: &TestResults)
+{
+ let file_contents = toml::to_string(&results).unwrap();
+
+ let commit_summary_fname = ktestrc.output_dir.join(commit_id.clone() + ".toml");
+ std::fs::write(commit_summary_fname, file_contents).unwrap();
+}
+
+use testresult_capnp::test_results;
+use capnp::serialize;
+
+fn status_to_capnp(s: TestStatus) -> testresult_capnp::test_result::Status {
+ use testresult_capnp::test_result::Status;
+ match s {
+ TestStatus::InProgress => Status::Inprogress,
+ TestStatus::Passed => Status::Passed,
+ TestStatus::Failed => Status::Failed,
+ TestStatus::NotRun => Status::Notrun,
+ TestStatus::NotStarted => Status::Notstarted,
+ TestStatus::Unknown => Status::Unknown,
+ }
+}
+
+fn status_from_capnp(s: testresult_capnp::test_result::Status) -> TestStatus {
+ use testresult_capnp::test_result::Status;
+ match s {
+ Status::Inprogress => TestStatus::InProgress,
+ Status::Passed => TestStatus::Passed,
+ Status::Failed => TestStatus::Failed,
+ Status::Notrun => TestStatus::NotRun,
+ Status::Notstarted => TestStatus::NotStarted,
+ Status::Unknown => TestStatus::Unknown,
+ }
+}
+
+fn results_to_capnp(ktestrc: &Ktestrc, commit_id: &String, results_in: &TestResultsMap) -> Result<(), Box<dyn Error>> {
+ let mut message = capnp::message::Builder::new_default();
+ let results = message.init_root::<test_results::Builder>();
+ let mut result_list = results.init_entries(results_in.len().try_into().unwrap());
+
+ for (idx, (name, result_in)) in results_in.iter().enumerate() {
+ let mut result = result_list.reborrow().get(idx.try_into().unwrap());
+
+ result.set_name(name);
+ result.set_duration(result_in.duration.try_into().unwrap());
+ result.set_status(status_to_capnp(result_in.status));
+ }
+
+ let fname = ktestrc.output_dir.join(commit_id.clone() + ".capnp");
+ let fname_new = ktestrc.output_dir.join(commit_id.clone() + ".capnp.new");
+
+ let mut out = File::create(&fname_new)?;
+
+ serialize::write_message(&mut out, &message)?;
+ drop(out);
+ std::fs::rename(fname_new, fname)?;
+
+ Ok(())
+}
+
+pub fn commit_update_results_from_fs(ktestrc: &Ktestrc, commit_id: &String)
+{
+ let results = TestResults { d: commitdir_get_results_fs(&ktestrc, commit_id) };
+
+ results_to_toml(ktestrc, commit_id, &results);
+ results_to_capnp(ktestrc, commit_id, &results.d)
+ .map_err(|e| eprintln!("error generating capnp: {}", e)).ok();
+}
+
+pub fn commit_get_results_capnp(ktestrc: &Ktestrc, commit_id: &String) -> Result<TestResultsMap, Box<dyn Error>> {
+ let f = std::fs::read(ktestrc.output_dir.join(commit_id.to_owned() + ".capnp"))?;
+
+ let message_reader = serialize::read_message_from_flat_slice(&mut &f[..], capnp::message::ReaderOptions::new())?;
+ let entries = message_reader.get_root::<test_results::Reader>()?
+ .get_entries()?;
+
+ let mut results = BTreeMap::new();
+ for e in entries {
+ let r = TestResult {
+ status: status_from_capnp(e.get_status()?),
+ duration: e.get_duration()
+ };
+
+ results.insert(e.get_name()?.to_string(), r);
+ }
+
+ Ok(results)
+}
diff --git a/ci-web/src/testresult.capnp b/ci-web/src/testresult.capnp
new file mode 100644
index 0000000..565faba
--- /dev/null
+++ b/ci-web/src/testresult.capnp
@@ -0,0 +1,19 @@
+@0x9527f7d16acca92e;
+
+struct TestResult {
+ name @0 :Text;
+ duration @1 :UInt64;
+ status @2 :Status;
+ enum Status {
+ inprogress @0;
+ passed @1;
+ failed @2;
+ notrun @3;
+ notstarted @4;
+ unknown @5;
+ }
+}
+
+struct TestResults {
+ entries @0: List(TestResult);
+}
diff --git a/ci-web/src/testresult_capnp.rs b/ci-web/src/testresult_capnp.rs
new file mode 100644
index 0000000..a6643cf
--- /dev/null
+++ b/ci-web/src/testresult_capnp.rs
@@ -0,0 +1,570 @@
+// @generated by the capnpc-rust plugin to the Cap'n Proto schema compiler.
+// DO NOT EDIT.
+// source: src/testresult.capnp
+
+
+pub mod test_result {
+ #[derive(Copy, Clone)]
+ pub struct Owned(());
+ impl ::capnp::introspect::Introspect for Owned { fn introspect() -> ::capnp::introspect::Type { ::capnp::introspect::TypeVariant::Struct(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types, annotation_types: _private::get_annotation_types }).into() } }
+ impl ::capnp::traits::Owned for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
+ impl ::capnp::traits::OwnedStruct for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
+ impl ::capnp::traits::Pipelined for Owned { type Pipeline = Pipeline; }
+
+ pub struct Reader<'a> { reader: ::capnp::private::layout::StructReader<'a> }
+ impl <'a,> ::core::marker::Copy for Reader<'a,> {}
+ impl <'a,> ::core::clone::Clone for Reader<'a,> {
+ fn clone(&self) -> Self { *self }
+ }
+
+ impl <'a,> ::capnp::traits::HasTypeId for Reader<'a,> {
+ const TYPE_ID: u64 = _private::TYPE_ID;
+ }
+ impl <'a,> ::core::convert::From<::capnp::private::layout::StructReader<'a>> for Reader<'a,> {
+ fn from(reader: ::capnp::private::layout::StructReader<'a>) -> Self {
+ Self { reader, }
+ }
+ }
+
+ impl <'a,> ::core::convert::From<Reader<'a,>> for ::capnp::dynamic_value::Reader<'a> {
+ fn from(reader: Reader<'a,>) -> Self {
+ Self::Struct(::capnp::dynamic_struct::Reader::new(reader.reader, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
+ }
+ }
+
+ impl <'a,> ::core::fmt::Debug for Reader<'a,> {
+ fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::result::Result<(), ::core::fmt::Error> {
+ core::fmt::Debug::fmt(&::core::convert::Into::<::capnp::dynamic_value::Reader<'_>>::into(*self), f)
+ }
+ }
+
+ impl <'a,> ::capnp::traits::FromPointerReader<'a> for Reader<'a,> {
+ fn get_from_pointer(reader: &::capnp::private::layout::PointerReader<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
+ ::core::result::Result::Ok(reader.get_struct(default)?.into())
+ }
+ }
+
+ impl <'a,> ::capnp::traits::IntoInternalStructReader<'a> for Reader<'a,> {
+ fn into_internal_struct_reader(self) -> ::capnp::private::layout::StructReader<'a> {
+ self.reader
+ }
+ }
+
+ impl <'a,> ::capnp::traits::Imbue<'a> for Reader<'a,> {
+ fn imbue(&mut self, cap_table: &'a ::capnp::private::layout::CapTable) {
+ self.reader.imbue(::capnp::private::layout::CapTableReader::Plain(cap_table))
+ }
+ }
+
+ impl <'a,> Reader<'a,> {
+ pub fn reborrow(&self) -> Reader<'_,> {
+ Self { .. *self }
+ }
+
+ pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
+ self.reader.total_size()
+ }
+ #[inline]
+ pub fn get_name(self) -> ::capnp::Result<::capnp::text::Reader<'a>> {
+ ::capnp::traits::FromPointerReader::get_from_pointer(&self.reader.get_pointer_field(0), ::core::option::Option::None)
+ }
+ #[inline]
+ pub fn has_name(&self) -> bool {
+ !self.reader.get_pointer_field(0).is_null()
+ }
+ #[inline]
+ pub fn get_duration(self) -> u64 {
+ self.reader.get_data_field::<u64>(0)
+ }
+ #[inline]
+ pub fn get_status(self) -> ::core::result::Result<crate::testresult_capnp::test_result::Status,::capnp::NotInSchema> {
+ ::core::convert::TryInto::try_into(self.reader.get_data_field::<u16>(4))
+ }
+ }
+
+ pub struct Builder<'a> { builder: ::capnp::private::layout::StructBuilder<'a> }
+ impl <'a,> ::capnp::traits::HasStructSize for Builder<'a,> {
+ const STRUCT_SIZE: ::capnp::private::layout::StructSize = ::capnp::private::layout::StructSize { data: 2, pointers: 1 };
+ }
+ impl <'a,> ::capnp::traits::HasTypeId for Builder<'a,> {
+ const TYPE_ID: u64 = _private::TYPE_ID;
+ }
+ impl <'a,> ::core::convert::From<::capnp::private::layout::StructBuilder<'a>> for Builder<'a,> {
+ fn from(builder: ::capnp::private::layout::StructBuilder<'a>) -> Self {
+ Self { builder, }
+ }
+ }
+
+ impl <'a,> ::core::convert::From<Builder<'a,>> for ::capnp::dynamic_value::Builder<'a> {
+ fn from(builder: Builder<'a,>) -> Self {
+ Self::Struct(::capnp::dynamic_struct::Builder::new(builder.builder, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
+ }
+ }
+
+ impl <'a,> ::capnp::traits::ImbueMut<'a> for Builder<'a,> {
+ fn imbue_mut(&mut self, cap_table: &'a mut ::capnp::private::layout::CapTable) {
+ self.builder.imbue(::capnp::private::layout::CapTableBuilder::Plain(cap_table))
+ }
+ }
+
+ impl <'a,> ::capnp::traits::FromPointerBuilder<'a> for Builder<'a,> {
+ fn init_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, _size: u32) -> Self {
+ builder.init_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE).into()
+ }
+ fn get_from_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
+ ::core::result::Result::Ok(builder.get_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE, default)?.into())
+ }
+ }
+
+ impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
+ fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
+ }
+
+ impl <'a,> Builder<'a,> {
+ pub fn into_reader(self) -> Reader<'a,> {
+ self.builder.into_reader().into()
+ }
+ pub fn reborrow(&mut self) -> Builder<'_,> {
+ Builder { builder: self.builder.reborrow() }
+ }
+ pub fn reborrow_as_reader(&self) -> Reader<'_,> {
+ self.builder.as_reader().into()
+ }
+
+ pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
+ self.builder.as_reader().total_size()
+ }
+ #[inline]
+ pub fn get_name(self) -> ::capnp::Result<::capnp::text::Builder<'a>> {
+ ::capnp::traits::FromPointerBuilder::get_from_pointer(self.builder.get_pointer_field(0), ::core::option::Option::None)
+ }
+ #[inline]
+ pub fn set_name(&mut self, value: ::capnp::text::Reader<'_>) {
+ self.builder.reborrow().get_pointer_field(0).set_text(value);
+ }
+ #[inline]
+ pub fn init_name(self, size: u32) -> ::capnp::text::Builder<'a> {
+ self.builder.get_pointer_field(0).init_text(size)
+ }
+ #[inline]
+ pub fn has_name(&self) -> bool {
+ !self.builder.is_pointer_field_null(0)
+ }
+ #[inline]
+ pub fn get_duration(self) -> u64 {
+ self.builder.get_data_field::<u64>(0)
+ }
+ #[inline]
+ pub fn set_duration(&mut self, value: u64) {
+ self.builder.set_data_field::<u64>(0, value);
+ }
+ #[inline]
+ pub fn get_status(self) -> ::core::result::Result<crate::testresult_capnp::test_result::Status,::capnp::NotInSchema> {
+ ::core::convert::TryInto::try_into(self.builder.get_data_field::<u16>(4))
+ }
+ #[inline]
+ pub fn set_status(&mut self, value: crate::testresult_capnp::test_result::Status) {
+ self.builder.set_data_field::<u16>(4, value as u16);
+ }
+ }
+
+ pub struct Pipeline { _typeless: ::capnp::any_pointer::Pipeline }
+ impl ::capnp::capability::FromTypelessPipeline for Pipeline {
+ fn new(typeless: ::capnp::any_pointer::Pipeline) -> Self {
+ Self { _typeless: typeless, }
+ }
+ }
+ impl Pipeline {
+ }
+ mod _private {
+ pub static ENCODED_NODE: [::capnp::Word; 67] = [
+ ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0),
+ ::capnp::word(20, 193, 122, 80, 80, 124, 122, 173),
+ ::capnp::word(21, 0, 0, 0, 1, 0, 2, 0),
+ ::capnp::word(46, 169, 204, 106, 209, 247, 39, 149),
+ ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(21, 0, 0, 0, 2, 1, 0, 0),
+ ::capnp::word(33, 0, 0, 0, 23, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(41, 0, 0, 0, 175, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(115, 114, 99, 47, 116, 101, 115, 116),
+ ::capnp::word(114, 101, 115, 117, 108, 116, 46, 99),
+ ::capnp::word(97, 112, 110, 112, 58, 84, 101, 115),
+ ::capnp::word(116, 82, 101, 115, 117, 108, 116, 0),
+ ::capnp::word(4, 0, 0, 0, 1, 0, 1, 0),
+ ::capnp::word(148, 56, 159, 232, 142, 141, 179, 252),
+ ::capnp::word(1, 0, 0, 0, 58, 0, 0, 0),
+ ::capnp::word(83, 116, 97, 116, 117, 115, 0, 0),
+ ::capnp::word(12, 0, 0, 0, 3, 0, 4, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 1, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(69, 0, 0, 0, 42, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(64, 0, 0, 0, 3, 0, 1, 0),
+ ::capnp::word(76, 0, 0, 0, 2, 0, 1, 0),
+ ::capnp::word(1, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 1, 0, 1, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(73, 0, 0, 0, 74, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(72, 0, 0, 0, 3, 0, 1, 0),
+ ::capnp::word(84, 0, 0, 0, 2, 0, 1, 0),
+ ::capnp::word(2, 0, 0, 0, 4, 0, 0, 0),
+ ::capnp::word(0, 0, 1, 0, 2, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(81, 0, 0, 0, 58, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(76, 0, 0, 0, 3, 0, 1, 0),
+ ::capnp::word(88, 0, 0, 0, 2, 0, 1, 0),
+ ::capnp::word(110, 97, 109, 101, 0, 0, 0, 0),
+ ::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(12, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(100, 117, 114, 97, 116, 105, 111, 110),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(9, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(9, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(115, 116, 97, 116, 117, 115, 0, 0),
+ ::capnp::word(15, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(148, 56, 159, 232, 142, 141, 179, 252),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(15, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ];
+ pub fn get_field_types(index: u16) -> ::capnp::introspect::Type {
+ match index {
+ 0 => <::capnp::text::Owned as ::capnp::introspect::Introspect>::introspect(),
+ 1 => <u64 as ::capnp::introspect::Introspect>::introspect(),
+ 2 => <crate::testresult_capnp::test_result::Status as ::capnp::introspect::Introspect>::introspect(),
+ _ => panic!("invalid field index {}", index),
+ }
+ }
+ pub fn get_annotation_types(child_index: Option<u16>, index: u32) -> ::capnp::introspect::Type {
+ panic!("invalid annotation indices ({:?}, {}) ", child_index, index)
+ }
+ pub static RAW_SCHEMA: ::capnp::introspect::RawStructSchema = ::capnp::introspect::RawStructSchema {
+ encoded_node: &ENCODED_NODE,
+ nonunion_members: NONUNION_MEMBERS,
+ members_by_discriminant: MEMBERS_BY_DISCRIMINANT,
+ };
+ pub static NONUNION_MEMBERS : &[u16] = &[0,1,2];
+ pub static MEMBERS_BY_DISCRIMINANT : &[u16] = &[];
+ pub const TYPE_ID: u64 = 0xad7a_7c50_507a_c114;
+ }
+
+ #[repr(u16)]
+ #[derive(Clone, Copy, Debug, PartialEq, Eq)]
+ pub enum Status {
+ Inprogress = 0,
+ Passed = 1,
+ Failed = 2,
+ Notrun = 3,
+ Notstarted = 4,
+ Unknown = 5,
+ }
+
+ impl ::capnp::introspect::Introspect for Status {
+ fn introspect() -> ::capnp::introspect::Type { ::capnp::introspect::TypeVariant::Enum(::capnp::introspect::RawEnumSchema { encoded_node: &status::ENCODED_NODE, annotation_types: status::get_annotation_types }).into() }
+ }
+ impl <'a> ::core::convert::From<Status> for ::capnp::dynamic_value::Reader<'a> {
+ fn from(e: Status) -> Self { ::capnp::dynamic_value::Enum::new(e.into(), ::capnp::introspect::RawEnumSchema { encoded_node: &status::ENCODED_NODE, annotation_types: status::get_annotation_types }.into()).into() }
+ }
+ impl ::core::convert::TryFrom<u16> for Status {
+ type Error = ::capnp::NotInSchema;
+ fn try_from(value: u16) -> ::core::result::Result<Self, <Status as ::core::convert::TryFrom<u16>>::Error> {
+ match value {
+ 0 => ::core::result::Result::Ok(Self::Inprogress),
+ 1 => ::core::result::Result::Ok(Self::Passed),
+ 2 => ::core::result::Result::Ok(Self::Failed),
+ 3 => ::core::result::Result::Ok(Self::Notrun),
+ 4 => ::core::result::Result::Ok(Self::Notstarted),
+ 5 => ::core::result::Result::Ok(Self::Unknown),
+ n => ::core::result::Result::Err(::capnp::NotInSchema(n)),
+ }
+ }
+ }
+ impl From<Status> for u16 {
+ #[inline]
+ fn from(x: Status) -> u16 { x as u16 }
+ }
+ impl ::capnp::traits::HasTypeId for Status {
+ const TYPE_ID: u64 = 0xfcb3_8d8e_e89f_3894u64;
+ }
+ mod status {
+ pub static ENCODED_NODE: [::capnp::Word; 45] = [
+ ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0),
+ ::capnp::word(148, 56, 159, 232, 142, 141, 179, 252),
+ ::capnp::word(32, 0, 0, 0, 2, 0, 0, 0),
+ ::capnp::word(20, 193, 122, 80, 80, 124, 122, 173),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(21, 0, 0, 0, 58, 1, 0, 0),
+ ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(33, 0, 0, 0, 151, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(115, 114, 99, 47, 116, 101, 115, 116),
+ ::capnp::word(114, 101, 115, 117, 108, 116, 46, 99),
+ ::capnp::word(97, 112, 110, 112, 58, 84, 101, 115),
+ ::capnp::word(116, 82, 101, 115, 117, 108, 116, 46),
+ ::capnp::word(83, 116, 97, 116, 117, 115, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 1, 0, 1, 0),
+ ::capnp::word(24, 0, 0, 0, 1, 0, 2, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(65, 0, 0, 0, 90, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(1, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(61, 0, 0, 0, 58, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(2, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(53, 0, 0, 0, 58, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(3, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(45, 0, 0, 0, 58, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(4, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(37, 0, 0, 0, 90, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(5, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(33, 0, 0, 0, 66, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(105, 110, 112, 114, 111, 103, 114, 101),
+ ::capnp::word(115, 115, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(112, 97, 115, 115, 101, 100, 0, 0),
+ ::capnp::word(102, 97, 105, 108, 101, 100, 0, 0),
+ ::capnp::word(110, 111, 116, 114, 117, 110, 0, 0),
+ ::capnp::word(110, 111, 116, 115, 116, 97, 114, 116),
+ ::capnp::word(101, 100, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(117, 110, 107, 110, 111, 119, 110, 0),
+ ];
+ pub fn get_annotation_types(child_index: Option<u16>, index: u32) -> ::capnp::introspect::Type {
+ panic!("invalid annotation indices ({:?}, {}) ", child_index, index)
+ }
+ }
+}
+
+pub mod test_results {
+ #[derive(Copy, Clone)]
+ pub struct Owned(());
+ impl ::capnp::introspect::Introspect for Owned { fn introspect() -> ::capnp::introspect::Type { ::capnp::introspect::TypeVariant::Struct(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types, annotation_types: _private::get_annotation_types }).into() } }
+ impl ::capnp::traits::Owned for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
+ impl ::capnp::traits::OwnedStruct for Owned { type Reader<'a> = Reader<'a>; type Builder<'a> = Builder<'a>; }
+ impl ::capnp::traits::Pipelined for Owned { type Pipeline = Pipeline; }
+
+ pub struct Reader<'a> { reader: ::capnp::private::layout::StructReader<'a> }
+ impl <'a,> ::core::marker::Copy for Reader<'a,> {}
+ impl <'a,> ::core::clone::Clone for Reader<'a,> {
+ fn clone(&self) -> Self { *self }
+ }
+
+ impl <'a,> ::capnp::traits::HasTypeId for Reader<'a,> {
+ const TYPE_ID: u64 = _private::TYPE_ID;
+ }
+ impl <'a,> ::core::convert::From<::capnp::private::layout::StructReader<'a>> for Reader<'a,> {
+ fn from(reader: ::capnp::private::layout::StructReader<'a>) -> Self {
+ Self { reader, }
+ }
+ }
+
+ impl <'a,> ::core::convert::From<Reader<'a,>> for ::capnp::dynamic_value::Reader<'a> {
+ fn from(reader: Reader<'a,>) -> Self {
+ Self::Struct(::capnp::dynamic_struct::Reader::new(reader.reader, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
+ }
+ }
+
+ impl <'a,> ::core::fmt::Debug for Reader<'a,> {
+ fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::result::Result<(), ::core::fmt::Error> {
+ core::fmt::Debug::fmt(&::core::convert::Into::<::capnp::dynamic_value::Reader<'_>>::into(*self), f)
+ }
+ }
+
+ impl <'a,> ::capnp::traits::FromPointerReader<'a> for Reader<'a,> {
+ fn get_from_pointer(reader: &::capnp::private::layout::PointerReader<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
+ ::core::result::Result::Ok(reader.get_struct(default)?.into())
+ }
+ }
+
+ impl <'a,> ::capnp::traits::IntoInternalStructReader<'a> for Reader<'a,> {
+ fn into_internal_struct_reader(self) -> ::capnp::private::layout::StructReader<'a> {
+ self.reader
+ }
+ }
+
+ impl <'a,> ::capnp::traits::Imbue<'a> for Reader<'a,> {
+ fn imbue(&mut self, cap_table: &'a ::capnp::private::layout::CapTable) {
+ self.reader.imbue(::capnp::private::layout::CapTableReader::Plain(cap_table))
+ }
+ }
+
+ impl <'a,> Reader<'a,> {
+ pub fn reborrow(&self) -> Reader<'_,> {
+ Self { .. *self }
+ }
+
+ pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
+ self.reader.total_size()
+ }
+ #[inline]
+ pub fn get_entries(self) -> ::capnp::Result<::capnp::struct_list::Reader<'a,crate::testresult_capnp::test_result::Owned>> {
+ ::capnp::traits::FromPointerReader::get_from_pointer(&self.reader.get_pointer_field(0), ::core::option::Option::None)
+ }
+ #[inline]
+ pub fn has_entries(&self) -> bool {
+ !self.reader.get_pointer_field(0).is_null()
+ }
+ }
+
+ pub struct Builder<'a> { builder: ::capnp::private::layout::StructBuilder<'a> }
+ impl <'a,> ::capnp::traits::HasStructSize for Builder<'a,> {
+ const STRUCT_SIZE: ::capnp::private::layout::StructSize = ::capnp::private::layout::StructSize { data: 0, pointers: 1 };
+ }
+ impl <'a,> ::capnp::traits::HasTypeId for Builder<'a,> {
+ const TYPE_ID: u64 = _private::TYPE_ID;
+ }
+ impl <'a,> ::core::convert::From<::capnp::private::layout::StructBuilder<'a>> for Builder<'a,> {
+ fn from(builder: ::capnp::private::layout::StructBuilder<'a>) -> Self {
+ Self { builder, }
+ }
+ }
+
+ impl <'a,> ::core::convert::From<Builder<'a,>> for ::capnp::dynamic_value::Builder<'a> {
+ fn from(builder: Builder<'a,>) -> Self {
+ Self::Struct(::capnp::dynamic_struct::Builder::new(builder.builder, ::capnp::schema::StructSchema::new(::capnp::introspect::RawBrandedStructSchema { generic: &_private::RAW_SCHEMA, field_types: _private::get_field_types::<>, annotation_types: _private::get_annotation_types::<>})))
+ }
+ }
+
+ impl <'a,> ::capnp::traits::ImbueMut<'a> for Builder<'a,> {
+ fn imbue_mut(&mut self, cap_table: &'a mut ::capnp::private::layout::CapTable) {
+ self.builder.imbue(::capnp::private::layout::CapTableBuilder::Plain(cap_table))
+ }
+ }
+
+ impl <'a,> ::capnp::traits::FromPointerBuilder<'a> for Builder<'a,> {
+ fn init_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, _size: u32) -> Self {
+ builder.init_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE).into()
+ }
+ fn get_from_pointer(builder: ::capnp::private::layout::PointerBuilder<'a>, default: ::core::option::Option<&'a [::capnp::Word]>) -> ::capnp::Result<Self> {
+ ::core::result::Result::Ok(builder.get_struct(<Self as ::capnp::traits::HasStructSize>::STRUCT_SIZE, default)?.into())
+ }
+ }
+
+ impl <'a,> ::capnp::traits::SetPointerBuilder for Reader<'a,> {
+ fn set_pointer_builder(mut pointer: ::capnp::private::layout::PointerBuilder<'_>, value: Self, canonicalize: bool) -> ::capnp::Result<()> { pointer.set_struct(&value.reader, canonicalize) }
+ }
+
+ impl <'a,> Builder<'a,> {
+ pub fn into_reader(self) -> Reader<'a,> {
+ self.builder.into_reader().into()
+ }
+ pub fn reborrow(&mut self) -> Builder<'_,> {
+ Builder { builder: self.builder.reborrow() }
+ }
+ pub fn reborrow_as_reader(&self) -> Reader<'_,> {
+ self.builder.as_reader().into()
+ }
+
+ pub fn total_size(&self) -> ::capnp::Result<::capnp::MessageSize> {
+ self.builder.as_reader().total_size()
+ }
+ #[inline]
+ pub fn get_entries(self) -> ::capnp::Result<::capnp::struct_list::Builder<'a,crate::testresult_capnp::test_result::Owned>> {
+ ::capnp::traits::FromPointerBuilder::get_from_pointer(self.builder.get_pointer_field(0), ::core::option::Option::None)
+ }
+ #[inline]
+ pub fn set_entries(&mut self, value: ::capnp::struct_list::Reader<'a,crate::testresult_capnp::test_result::Owned>) -> ::capnp::Result<()> {
+ ::capnp::traits::SetPointerBuilder::set_pointer_builder(self.builder.reborrow().get_pointer_field(0), value, false)
+ }
+ #[inline]
+ pub fn init_entries(self, size: u32) -> ::capnp::struct_list::Builder<'a,crate::testresult_capnp::test_result::Owned> {
+ ::capnp::traits::FromPointerBuilder::init_pointer(self.builder.get_pointer_field(0), size)
+ }
+ #[inline]
+ pub fn has_entries(&self) -> bool {
+ !self.builder.is_pointer_field_null(0)
+ }
+ }
+
+ pub struct Pipeline { _typeless: ::capnp::any_pointer::Pipeline }
+ impl ::capnp::capability::FromTypelessPipeline for Pipeline {
+ fn new(typeless: ::capnp::any_pointer::Pipeline) -> Self {
+ Self { _typeless: typeless, }
+ }
+ }
+ impl Pipeline {
+ }
+ mod _private {
+ pub static ENCODED_NODE: [::capnp::Word; 38] = [
+ ::capnp::word(0, 0, 0, 0, 5, 0, 6, 0),
+ ::capnp::word(223, 110, 53, 188, 215, 214, 13, 235),
+ ::capnp::word(21, 0, 0, 0, 1, 0, 0, 0),
+ ::capnp::word(46, 169, 204, 106, 209, 247, 39, 149),
+ ::capnp::word(1, 0, 7, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(21, 0, 0, 0, 10, 1, 0, 0),
+ ::capnp::word(37, 0, 0, 0, 7, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(33, 0, 0, 0, 63, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(115, 114, 99, 47, 116, 101, 115, 116),
+ ::capnp::word(114, 101, 115, 117, 108, 116, 46, 99),
+ ::capnp::word(97, 112, 110, 112, 58, 84, 101, 115),
+ ::capnp::word(116, 82, 101, 115, 117, 108, 116, 115),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 1, 0, 1, 0),
+ ::capnp::word(4, 0, 0, 0, 3, 0, 4, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 1, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(13, 0, 0, 0, 66, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(8, 0, 0, 0, 3, 0, 1, 0),
+ ::capnp::word(36, 0, 0, 0, 2, 0, 1, 0),
+ ::capnp::word(101, 110, 116, 114, 105, 101, 115, 0),
+ ::capnp::word(14, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 3, 0, 1, 0),
+ ::capnp::word(16, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(20, 193, 122, 80, 80, 124, 122, 173),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(14, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ::capnp::word(0, 0, 0, 0, 0, 0, 0, 0),
+ ];
+ pub fn get_field_types(index: u16) -> ::capnp::introspect::Type {
+ match index {
+ 0 => <::capnp::struct_list::Owned<crate::testresult_capnp::test_result::Owned> as ::capnp::introspect::Introspect>::introspect(),
+ _ => panic!("invalid field index {}", index),
+ }
+ }
+ pub fn get_annotation_types(child_index: Option<u16>, index: u32) -> ::capnp::introspect::Type {
+ panic!("invalid annotation indices ({:?}, {}) ", child_index, index)
+ }
+ pub static RAW_SCHEMA: ::capnp::introspect::RawStructSchema = ::capnp::introspect::RawStructSchema {
+ encoded_node: &ENCODED_NODE,
+ nonunion_members: NONUNION_MEMBERS,
+ members_by_discriminant: MEMBERS_BY_DISCRIMINANT,
+ };
+ pub static NONUNION_MEMBERS : &[u16] = &[0];
+ pub static MEMBERS_BY_DISCRIMINANT : &[u16] = &[];
+ pub const TYPE_ID: u64 = 0xeb0d_d6d7_bc35_6edf;
+ }
+}