1
- use std:: collections:: HashSet ;
1
+ use std:: collections:: HashMap ;
2
2
use std:: fmt:: { Display , Formatter } ;
3
3
use std:: fs;
4
4
@@ -7,6 +7,8 @@ use serde::Deserialize;
7
7
use smol_str:: SmolStr ;
8
8
use thiserror:: Error ;
9
9
10
+ use crate :: compiler_version:: VersionId ;
11
+
10
12
#[ cfg( test) ]
11
13
#[ path = "allowed_libfuncs_test.rs" ]
12
14
mod test;
@@ -27,6 +29,15 @@ pub enum AllowedLibfuncsError {
27
29
{BUILTIN_ALL_LIBFUNCS_LIST}' to allow all libfuncs."
28
30
) ]
29
31
UnsupportedLibfunc { invalid_libfunc : String , allowed_libfuncs_list_name : String } ,
32
+ #[ error(
33
+ "Libfunc {invalid_libfunc} requires version {required_version} while class version is {class_version}.\n
34
+ Run with '--allowed-libfuncs-list-name {BUILTIN_ALL_LIBFUNCS_LIST}' to allow all libfuncs."
35
+ ) ]
36
+ UnsupportedLibfuncAtVersion {
37
+ invalid_libfunc : String ,
38
+ required_version : VersionId ,
39
+ class_version : VersionId ,
40
+ } ,
30
41
}
31
42
32
43
/// A selector for the allowed libfunc list.
@@ -67,15 +78,17 @@ impl Display for ListSelector {
67
78
/// Represents a list of allowed sierra libfuncs.
68
79
#[ derive( Debug , PartialEq , Eq , Deserialize ) ]
69
80
pub struct AllowedLibfuncs {
70
- #[ serde( deserialize_with = "deserialize_libfuncs_set ::<_>" ) ]
71
- pub allowed_libfuncs : HashSet < GenericLibfuncId > ,
81
+ #[ serde( deserialize_with = "deserialize_libfuncs_map ::<_>" ) ]
82
+ pub allowed_libfuncs : HashMap < GenericLibfuncId , Option < VersionId > > ,
72
83
}
73
84
74
- fn deserialize_libfuncs_set < ' de , D : serde:: Deserializer < ' de > > (
85
+ fn deserialize_libfuncs_map < ' de , D : serde:: Deserializer < ' de > > (
75
86
deserializer : D ,
76
- ) -> Result < HashSet < GenericLibfuncId > , D :: Error > {
77
- Ok ( HashSet :: from_iter (
78
- Vec :: < SmolStr > :: deserialize ( deserializer) ?. into_iter ( ) . map ( GenericLibfuncId :: from_string) ,
87
+ ) -> Result < HashMap < GenericLibfuncId , Option < VersionId > > , D :: Error > {
88
+ Ok ( HashMap :: from_iter (
89
+ HashMap :: < SmolStr , Option < VersionId > > :: deserialize ( deserializer) ?
90
+ . into_iter ( )
91
+ . map ( |( id, v) | ( GenericLibfuncId :: from_string ( id) , v) ) ,
79
92
) )
80
93
}
81
94
0 commit comments