diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-05-30 00:24:11 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-05-30 00:24:11 -0400 |
commit | 03fdb87e8f81e35b981a596709c36582a5408732 (patch) | |
tree | 236c41ae91d06bbd6fcdf9ce13281b71dec1335d | |
parent | 6a1675824c3341b1b91e42a28c4578855810a933 (diff) |
ci-web: Serialize results with capnp
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | ci-web/Cargo.toml | 5 | ||||
-rw-r--r-- | ci-web/src/bin/cgi.rs | 2 | ||||
-rw-r--r-- | ci-web/src/bin/gen-commit-summary.rs | 10 | ||||
-rw-r--r-- | ci-web/src/build.rs | 9 | ||||
-rw-r--r-- | ci-web/src/lib.rs | 108 | ||||
-rw-r--r-- | ci-web/src/testresult.capnp | 19 | ||||
-rw-r--r-- | ci-web/src/testresult_capnp.rs | 570 |
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; + } +} |