opa_wasm/builtins/
mod.rs

1// Copyright 2022 The Matrix.org Foundation C.I.C.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15//! Handling of builtin functions.
16
17use anyhow::{bail, Result};
18
19use self::traits::{Builtin, BuiltinFunc};
20use crate::EvaluationContext;
21
22pub mod impls;
23pub mod traits;
24
25/// Resolve a builtin based on its name
26///
27/// # Errors
28///
29/// Returns an error if the builtin is not known
30#[allow(clippy::too_many_lines)]
31pub fn resolve<C: EvaluationContext>(name: &str) -> Result<Box<dyn Builtin<C>>> {
32    match name {
33        #[cfg(feature = "base64url-builtins")]
34        "base64url.encode_no_pad" => Ok(self::impls::base64url::encode_no_pad.wrap()),
35
36        #[cfg(all(feature = "crypto-md5-builtins", feature = "crypto-hmac-builtins"))]
37        "crypto.hmac.md5" => Ok(self::impls::crypto::hmac::md5.wrap()),
38
39        #[cfg(all(feature = "crypto-sha1-builtins", feature = "crypto-hmac-builtins"))]
40        "crypto.hmac.sha1" => Ok(self::impls::crypto::hmac::sha1.wrap()),
41
42        #[cfg(all(feature = "crypto-sha2-builtins", feature = "crypto-hmac-builtins"))]
43        "crypto.hmac.sha256" => Ok(self::impls::crypto::hmac::sha256.wrap()),
44
45        #[cfg(all(feature = "crypto-sha2-builtins", feature = "crypto-hmac-builtins"))]
46        "crypto.hmac.sha512" => Ok(self::impls::crypto::hmac::sha512.wrap()),
47
48        #[cfg(all(feature = "crypto-md5-builtins", feature = "crypto-digest-builtins"))]
49        "crypto.md5" => Ok(self::impls::crypto::digest::md5.wrap()),
50
51        #[cfg(all(feature = "crypto-sha1-builtins", feature = "crypto-digest-builtins"))]
52        "crypto.sha1" => Ok(self::impls::crypto::digest::sha1.wrap()),
53
54        #[cfg(all(feature = "crypto-sha2-builtins", feature = "crypto-digest-builtins"))]
55        "crypto.sha256" => Ok(self::impls::crypto::digest::sha256.wrap()),
56
57        "crypto.x509.parse_and_verify_certificates" => {
58            Ok(self::impls::crypto::x509::parse_and_verify_certificates.wrap())
59        }
60        "crypto.x509.parse_certificate_request" => {
61            Ok(self::impls::crypto::x509::parse_certificate_request.wrap())
62        }
63        "crypto.x509.parse_certificates" => {
64            Ok(self::impls::crypto::x509::parse_certificates.wrap())
65        }
66        "crypto.x509.parse_rsa_private_key" => {
67            Ok(self::impls::crypto::x509::parse_rsa_private_key.wrap())
68        }
69        "glob.quote_meta" => Ok(self::impls::glob::quote_meta.wrap()),
70        "graph.reachable_paths" => Ok(self::impls::graph::reachable_paths.wrap()),
71        "graphql.is_valid" => Ok(self::impls::graphql::is_valid.wrap()),
72        "graphql.parse" => Ok(self::impls::graphql::parse.wrap()),
73        "graphql.parse_and_verify" => Ok(self::impls::graphql::parse_and_verify.wrap()),
74        "graphql.parse_query" => Ok(self::impls::graphql::parse_query.wrap()),
75        "graphql.parse_schema" => Ok(self::impls::graphql::parse_schema.wrap()),
76
77        #[cfg(feature = "hex-builtins")]
78        "hex.decode" => Ok(self::impls::hex::decode.wrap()),
79
80        #[cfg(feature = "hex-builtins")]
81        "hex.encode" => Ok(self::impls::hex::encode.wrap()),
82
83        "http.send" => Ok(self::impls::http::send.wrap()),
84        "indexof_n" => Ok(self::impls::indexof_n.wrap()),
85        "io.jwt.decode" => Ok(self::impls::io::jwt::decode.wrap()),
86        "io.jwt.decode_verify" => Ok(self::impls::io::jwt::decode_verify.wrap()),
87        "io.jwt.encode_sign" => Ok(self::impls::io::jwt::encode_sign.wrap()),
88        "io.jwt.encode_sign_raw" => Ok(self::impls::io::jwt::encode_sign_raw.wrap()),
89        "io.jwt.verify_es256" => Ok(self::impls::io::jwt::verify_es256.wrap()),
90        "io.jwt.verify_es384" => Ok(self::impls::io::jwt::verify_es384.wrap()),
91        "io.jwt.verify_es512" => Ok(self::impls::io::jwt::verify_es512.wrap()),
92        "io.jwt.verify_hs256" => Ok(self::impls::io::jwt::verify_hs256.wrap()),
93        "io.jwt.verify_hs384" => Ok(self::impls::io::jwt::verify_hs384.wrap()),
94        "io.jwt.verify_hs512" => Ok(self::impls::io::jwt::verify_hs512.wrap()),
95        "io.jwt.verify_ps256" => Ok(self::impls::io::jwt::verify_ps256.wrap()),
96        "io.jwt.verify_ps384" => Ok(self::impls::io::jwt::verify_ps384.wrap()),
97        "io.jwt.verify_ps512" => Ok(self::impls::io::jwt::verify_ps512.wrap()),
98        "io.jwt.verify_rs256" => Ok(self::impls::io::jwt::verify_rs256.wrap()),
99        "io.jwt.verify_rs384" => Ok(self::impls::io::jwt::verify_rs384.wrap()),
100        "io.jwt.verify_rs512" => Ok(self::impls::io::jwt::verify_rs512.wrap()),
101
102        #[cfg(feature = "json-builtins")]
103        "json.patch" => Ok(self::impls::json::patch.wrap()),
104
105        "net.cidr_contains_matches" => Ok(self::impls::net::cidr_contains_matches.wrap()),
106        "net.cidr_expand" => Ok(self::impls::net::cidr_expand.wrap()),
107        "net.cidr_merge" => Ok(self::impls::net::cidr_merge.wrap()),
108        "net.lookup_ip_addr" => Ok(self::impls::net::lookup_ip_addr.wrap()),
109        "object.union_n" => Ok(self::impls::object::union_n.wrap()),
110        "opa.runtime" => Ok(self::impls::opa::runtime.wrap()),
111
112        #[cfg(feature = "rng")]
113        "rand.intn" => Ok(self::impls::rand::intn.wrap()),
114
115        "regex.find_n" => Ok(self::impls::regex::find_n.wrap()),
116        "regex.globs_match" => Ok(self::impls::regex::globs_match.wrap()),
117        "regex.split" => Ok(self::impls::regex::split.wrap()),
118        "regex.template_match" => Ok(self::impls::regex::template_match.wrap()),
119        "rego.parse_module" => Ok(self::impls::rego::parse_module.wrap()),
120
121        #[cfg(feature = "semver-builtins")]
122        "semver.compare" => Ok(self::impls::semver::compare.wrap()),
123
124        #[cfg(feature = "semver-builtins")]
125        "semver.is_valid" => Ok(self::impls::semver::is_valid.wrap()),
126
127        #[cfg(feature = "sprintf-builtins")]
128        "sprintf" => Ok(self::impls::sprintf.wrap()),
129
130        #[cfg(feature = "time-builtins")]
131        "time.add_date" => Ok(self::impls::time::add_date.wrap()),
132
133        #[cfg(feature = "time-builtins")]
134        "time.clock" => Ok(self::impls::time::clock.wrap()),
135
136        #[cfg(feature = "time-builtins")]
137        "time.date" => Ok(self::impls::time::date.wrap()),
138
139        #[cfg(feature = "time-builtins")]
140        "time.diff" => Ok(self::impls::time::diff.wrap()),
141
142        #[cfg(feature = "time-builtins")]
143        "time.now_ns" => Ok(self::impls::time::now_ns.wrap()),
144
145        #[cfg(feature = "time-builtins")]
146        "time.parse_duration_ns" => Ok(self::impls::time::parse_duration_ns.wrap()),
147
148        #[cfg(feature = "time-builtins")]
149        "time.parse_ns" => Ok(self::impls::time::parse_ns.wrap()),
150
151        #[cfg(feature = "time-builtins")]
152        "time.parse_rfc3339_ns" => Ok(self::impls::time::parse_rfc3339_ns.wrap()),
153
154        #[cfg(feature = "time-builtins")]
155        "time.weekday" => Ok(self::impls::time::weekday.wrap()),
156
157        "trace" => Ok(self::impls::trace.wrap()),
158
159        #[cfg(feature = "units-builtins")]
160        "units.parse" => Ok(self::impls::units::parse.wrap()),
161
162        #[cfg(feature = "units-builtins")]
163        "units.parse_bytes" => Ok(self::impls::units::parse_bytes.wrap()),
164
165        #[cfg(feature = "urlquery-builtins")]
166        "urlquery.decode" => Ok(self::impls::urlquery::decode.wrap()),
167
168        #[cfg(feature = "urlquery-builtins")]
169        "urlquery.decode_object" => Ok(self::impls::urlquery::decode_object.wrap()),
170
171        #[cfg(feature = "urlquery-builtins")]
172        "urlquery.encode" => Ok(self::impls::urlquery::encode.wrap()),
173
174        #[cfg(feature = "urlquery-builtins")]
175        "urlquery.encode_object" => Ok(self::impls::urlquery::encode_object.wrap()),
176
177        "uuid.rfc4122" => Ok(self::impls::uuid::rfc4122.wrap()),
178
179        #[cfg(feature = "yaml-builtins")]
180        "yaml.is_valid" => Ok(self::impls::yaml::is_valid.wrap()),
181
182        #[cfg(feature = "yaml-builtins")]
183        "yaml.marshal" => Ok(self::impls::yaml::marshal.wrap()),
184
185        #[cfg(feature = "yaml-builtins")]
186        "yaml.unmarshal" => Ok(self::impls::yaml::unmarshal.wrap()),
187        _ => bail!("unknown builtin"),
188    }
189}