#![allow(dead_code)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum HoloColorMode {
Rainbow,
SingleWave,
Iridescent,
}
#[derive(Debug, Clone)]
pub struct HolographicView {
pub color_mode: HoloColorMode,
pub diffraction_scale: f32,
pub brightness: f32,
pub rotation_speed: f32,
pub enabled: bool,
}
impl HolographicView {
pub fn new() -> Self {
HolographicView {
color_mode: HoloColorMode::Rainbow,
diffraction_scale: 0.5,
brightness: 1.0,
rotation_speed: 0.0,
enabled: true,
}
}
}
impl Default for HolographicView {
fn default() -> Self {
Self::new()
}
}
pub fn new_holographic_view() -> HolographicView {
HolographicView::new()
}
pub fn hgv_set_color_mode(view: &mut HolographicView, mode: HoloColorMode) {
view.color_mode = mode;
}
pub fn hgv_set_diffraction_scale(view: &mut HolographicView, scale: f32) {
view.diffraction_scale = scale.clamp(0.0, 2.0);
}
pub fn hgv_set_brightness(view: &mut HolographicView, brightness: f32) {
view.brightness = brightness.clamp(0.0, 4.0);
}
pub fn hgv_set_rotation_speed(view: &mut HolographicView, speed: f32) {
view.rotation_speed = speed.clamp(-360.0, 360.0);
}
pub fn hgv_set_enabled(view: &mut HolographicView, enabled: bool) {
view.enabled = enabled;
}
pub fn hgv_to_json(view: &HolographicView) -> String {
let mode = match view.color_mode {
HoloColorMode::Rainbow => "rainbow",
HoloColorMode::SingleWave => "single_wave",
HoloColorMode::Iridescent => "iridescent",
};
format!(
r#"{{"color_mode":"{}","diffraction_scale":{},"brightness":{},"rotation_speed":{},"enabled":{}}}"#,
mode, view.diffraction_scale, view.brightness, view.rotation_speed, view.enabled
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_color_mode() {
let v = new_holographic_view();
assert_eq!(
v.color_mode,
HoloColorMode::Rainbow
);
}
#[test]
fn test_set_color_mode() {
let mut v = new_holographic_view();
hgv_set_color_mode(&mut v, HoloColorMode::Iridescent);
assert_eq!(
v.color_mode,
HoloColorMode::Iridescent
);
}
#[test]
fn test_diffraction_scale_clamped() {
let mut v = new_holographic_view();
hgv_set_diffraction_scale(&mut v, 5.0);
assert!((v.diffraction_scale - 2.0).abs() < 1e-6 );
}
#[test]
fn test_brightness_clamped() {
let mut v = new_holographic_view();
hgv_set_brightness(&mut v, -1.0);
assert!((v.brightness).abs() < 1e-6 );
}
#[test]
fn test_rotation_speed_clamped() {
let mut v = new_holographic_view();
hgv_set_rotation_speed(&mut v, 1000.0);
assert!((v.rotation_speed - 360.0).abs() < 1e-6 );
}
#[test]
fn test_set_enabled() {
let mut v = new_holographic_view();
hgv_set_enabled(&mut v, false);
assert!(!v.enabled );
}
#[test]
fn test_to_json_has_color_mode() {
let v = new_holographic_view();
let j = hgv_to_json(&v);
assert!(j.contains("\"color_mode\"") );
}
#[test]
fn test_enabled_default() {
let v = new_holographic_view();
assert!(v.enabled );
}
#[test]
fn test_default_brightness() {
let v = new_holographic_view();
assert!((v.brightness - 1.0).abs() < 1e-6 );
}
#[test]
fn test_rotation_speed_negative_clamped() {
let mut v = new_holographic_view();
hgv_set_rotation_speed(&mut v, -1000.0);
assert!((v.rotation_speed + 360.0).abs() < 1e-6 );
}
}