-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathExtFun.lean
68 lines (54 loc) · 2.15 KB
/
ExtFun.lean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/-
Copyright Cedar Contributors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/
import Cedar.Spec.Value
/-! This file defines Cedar extension functions. -/
namespace Cedar.Spec
open Cedar.Spec.Ext
open Option
----- Definitions -----
inductive ExtFun where
| decimal ----- Decimal functions -----
| lessThan
| lessThanOrEqual
| greaterThan
| greaterThanOrEqual
| ip ----- IpAddr functions -----
| isIpv4
| isIpv6
| isLoopback
| isMulticast
| isInRange
def res {α} [Coe α Ext] : Option α → Result Value
| some v => .ok v
| none => .error .extensionError
def call : ExtFun → List Value → Result Value
| .decimal, [.prim (.string s)] => res (Decimal.decimal s)
| .lessThan,
[.ext (.decimal d₁), .ext (.decimal d₂)] => .ok (d₁ < d₂ : Bool)
| .lessThanOrEqual,
[.ext (.decimal d₁), .ext (.decimal d₂)] => .ok (d₁ ≤ d₂ : Bool)
| .greaterThan,
[.ext (.decimal d₁), .ext (.decimal d₂)] => .ok (d₁ > d₂ : Bool)
| .greaterThanOrEqual,
[.ext (.decimal d₁), .ext (.decimal d₂)] => .ok (d₁ ≥ d₂ : Bool)
| .ip, [.prim (.string s)] => res (IPAddr.ip s)
| .isIpv4, [.ext (.ipaddr a)] => .ok a.isV4
| .isIpv6, [.ext (.ipaddr a)] => .ok a.isV6
| .isLoopback, [.ext (.ipaddr a)] => .ok a.isLoopback
| .isMulticast, [.ext (.ipaddr a)] => .ok a.isMulticast
| .isInRange,
[.ext (.ipaddr a₁), .ext (.ipaddr a₂)] => .ok (a₁.inRange a₂)
| _, _ => .error .typeError
----- Derivations -----
deriving instance Repr, DecidableEq, Inhabited for ExtFun
end Cedar.Spec