@@ -27,6 +27,11 @@ use super::AssessArgs;
2727/// This is not a stable interface.
2828#[ derive( Serialize , Deserialize ) ]
2929pub struct AssessMetadata {
30+ /// Kani version that was used to generate the metadata.
31+ #[ serde( rename = "kani_version" ) ]
32+ pub version : String ,
33+ /// Contains an error message in cases where it failed the execution.
34+ pub error : Option < SessionError > ,
3035 /// Report on the presence of `codegen_unimplemented` in the analyzed packages
3136 pub unsupported_features : TableBuilder < UnsupportedFeaturesTableRow > ,
3237 /// Report of the reasons why tests could not be analyzed by Kani
@@ -35,32 +40,62 @@ pub struct AssessMetadata {
3540 pub promising_tests : TableBuilder < PromisingTestsTableRow > ,
3641}
3742
43+ impl AssessMetadata {
44+ pub fn new (
45+ unsupported_features : TableBuilder < UnsupportedFeaturesTableRow > ,
46+ failure_reasons : TableBuilder < FailureReasonsTableRow > ,
47+ promising_tests : TableBuilder < PromisingTestsTableRow > ,
48+ ) -> AssessMetadata {
49+ AssessMetadata {
50+ version : env ! ( "CARGO_PKG_VERSION" ) . to_string ( ) ,
51+ error : None ,
52+ unsupported_features,
53+ failure_reasons,
54+ promising_tests,
55+ }
56+ }
57+
58+ pub fn from_error ( err : & dyn std:: error:: Error ) -> AssessMetadata {
59+ let error = Some ( SessionError {
60+ root_cause : err. source ( ) . map ( |e| format ! ( "{e:#}" ) ) ,
61+ msg : err. to_string ( ) ,
62+ } ) ;
63+ AssessMetadata {
64+ version : env ! ( "CARGO_PKG_VERSION" ) . to_string ( ) ,
65+ error,
66+ unsupported_features : TableBuilder :: new ( ) ,
67+ failure_reasons : TableBuilder :: new ( ) ,
68+ promising_tests : TableBuilder :: new ( ) ,
69+ }
70+ }
71+ pub fn empty ( ) -> AssessMetadata {
72+ AssessMetadata {
73+ version : env ! ( "CARGO_PKG_VERSION" ) . to_string ( ) ,
74+ error : None ,
75+ unsupported_features : TableBuilder :: new ( ) ,
76+ failure_reasons : TableBuilder :: new ( ) ,
77+ promising_tests : TableBuilder :: new ( ) ,
78+ }
79+ }
80+ }
81+
82+ #[ derive( Serialize , Deserialize , Debug ) ]
83+ pub struct SessionError {
84+ pub root_cause : Option < String > ,
85+ pub msg : String ,
86+ }
87+
3888/// If given the argument to so do, write the assess metadata to the target file.
39- pub ( crate ) fn write_metadata ( args : & AssessArgs , build : AssessMetadata ) -> Result < ( ) > {
89+ pub ( crate ) fn write_metadata ( args : & AssessArgs , metadata : AssessMetadata ) -> Result < ( ) > {
4090 if let Some ( path) = & args. emit_metadata {
4191 let out_file = File :: create ( & path) ?;
4292 let writer = BufWriter :: new ( out_file) ;
4393 // use pretty for now to keep things readable and debuggable, but this should change eventually
44- serde_json:: to_writer_pretty ( writer, & build ) ?;
94+ serde_json:: to_writer_pretty ( writer, & metadata ) ?;
4595 }
4696 Ok ( ( ) )
4797}
4898
49- /// Write metadata with unsupported features only, supporting the `--only-codegen` option.
50- pub ( crate ) fn write_partial_metadata (
51- args : & AssessArgs ,
52- unsupported_features : TableBuilder < UnsupportedFeaturesTableRow > ,
53- ) -> Result < ( ) > {
54- write_metadata (
55- args,
56- AssessMetadata {
57- unsupported_features,
58- failure_reasons : TableBuilder :: new ( ) ,
59- promising_tests : TableBuilder :: new ( ) ,
60- } ,
61- )
62- }
63-
6499/// Read assess metadata from a file.
65100pub ( crate ) fn read_metadata ( path : & Path ) -> Result < AssessMetadata > {
66101 // this function already exists, but a proxy here helps find it :)
@@ -72,11 +107,7 @@ pub(crate) fn read_metadata(path: &Path) -> Result<AssessMetadata> {
72107/// This is not a complicated operation, because the assess metadata structure is meant
73108/// to accomodate multiple packages already, so we're just "putting it together".
74109pub ( crate ) fn aggregate_metadata ( metas : Vec < AssessMetadata > ) -> AssessMetadata {
75- let mut result = AssessMetadata {
76- unsupported_features : TableBuilder :: new ( ) ,
77- failure_reasons : TableBuilder :: new ( ) ,
78- promising_tests : TableBuilder :: new ( ) ,
79- } ;
110+ let mut result = AssessMetadata :: empty ( ) ;
80111 for meta in metas {
81112 for item in meta. unsupported_features . build ( ) {
82113 result. unsupported_features . add ( item. clone ( ) ) ;
0 commit comments