#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct HopperProgramPolicy {
pub strict: bool,
pub enforce_token_checks: bool,
pub allow_unsafe: bool,
}
impl HopperProgramPolicy {
pub const STRICT: Self = Self {
strict: true,
enforce_token_checks: true,
allow_unsafe: true,
};
pub const SEALED: Self = Self {
strict: true,
enforce_token_checks: true,
allow_unsafe: false,
};
pub const RAW: Self = Self {
strict: false,
enforce_token_checks: false,
allow_unsafe: true,
};
#[inline(always)]
pub const fn default_policy() -> Self {
Self::STRICT
}
}
impl Default for HopperProgramPolicy {
fn default() -> Self {
Self::default_policy()
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct HopperInstructionPolicy {
pub unsafe_memory: bool,
pub skip_token_checks: bool,
pub ctx_args: u8,
}
impl HopperInstructionPolicy {
pub const INHERIT: Self = Self {
unsafe_memory: false,
skip_token_checks: false,
ctx_args: 0,
};
}
impl Default for HopperInstructionPolicy {
fn default() -> Self {
Self::INHERIT
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn named_modes_differ_on_every_lever() {
assert!(HopperProgramPolicy::STRICT.strict);
assert!(HopperProgramPolicy::STRICT.enforce_token_checks);
assert!(HopperProgramPolicy::STRICT.allow_unsafe);
assert!(HopperProgramPolicy::SEALED.strict);
assert!(HopperProgramPolicy::SEALED.enforce_token_checks);
assert!(!HopperProgramPolicy::SEALED.allow_unsafe);
assert!(!HopperProgramPolicy::RAW.strict);
assert!(!HopperProgramPolicy::RAW.enforce_token_checks);
assert!(HopperProgramPolicy::RAW.allow_unsafe);
}
#[test]
fn default_policy_is_strict() {
assert_eq!(HopperProgramPolicy::default(), HopperProgramPolicy::STRICT);
assert_eq!(HopperProgramPolicy::default_policy(), HopperProgramPolicy::STRICT);
}
#[test]
fn instruction_inherit_zeroes_every_lever() {
assert!(!HopperInstructionPolicy::INHERIT.unsafe_memory);
assert!(!HopperInstructionPolicy::INHERIT.skip_token_checks);
assert_eq!(HopperInstructionPolicy::INHERIT.ctx_args, 0);
assert_eq!(HopperInstructionPolicy::default(), HopperInstructionPolicy::INHERIT);
}
#[test]
fn instruction_ctx_args_round_trips() {
let p = HopperInstructionPolicy {
unsafe_memory: false,
skip_token_checks: false,
ctx_args: 3,
};
assert_eq!(p.ctx_args, 3);
assert_ne!(p, HopperInstructionPolicy::INHERIT);
}
}