Secrets: Secret parameters
● Intermediate3 min
A secret can go to a parameter that is secret itself, and nowhere else.
type Order {
id: Int
secret card: String
}
fn charge(secret card: String, amount: Int) -> String {
"charged {amount}, card of {card.len()} digits"
}
fn main() {
const order = Order(id: 7, card: "4242424242421881")
print(charge(order.card, 499))
const card = reveal(order.card)
print("ends in {card.slice(12, 16)}")
}The program ran and printed:
kavach run secret-param.kav
charged 499, card of 16 digitsends in 1881
Inside charge, card is a secret like the field it came from. So is a variable set from a secret: here c is, and an ordinary parameter can't take it:
type Order {
id: Int
secret card: String
}
fn remember(text: String) {
}
fn main() {
const order = Order(id: 7, card: "4242 4242 4242 1881")
const c = order.card
remember(c)
}The compiler refused the program:
kavach run secret-remember.kav
error: `c` is secret, so it can't go into the argument `text` of `remember`, which isn't `secret`; mark it `secret`, or use `reveal(…)` if you really mean to