switch_power.rs 921 B

123456789101112131415161718192021222324252627282930313233343536
  1. use lever_api::prelude::*;
  2. use solana_program::msg;
  3. use steel::*;
  4. pub fn process_switch_power(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
  5. // Parse args.
  6. let args = SetPowerStatus::try_from_bytes(data)?;
  7. let name = bytes_to_str(&args.name);
  8. // Load accounts.
  9. let [power_info] = accounts else {
  10. return Err(ProgramError::NotEnoughAccountKeys);
  11. };
  12. power_info.is_writable()?;
  13. let power = power_info
  14. .as_account_mut::<PowerStatus>(&lever_api::ID)?
  15. .assert_mut(|c| c.is_on <= 1)?;
  16. match power.is_on {
  17. 0 => power.is_on = 1,
  18. 1 => power.is_on = 0,
  19. _ => panic!("Invalid boolean value"),
  20. }
  21. msg!("{} is pulling the power switch!", &name);
  22. match power.is_on {
  23. 1 => msg!("The power is now on."),
  24. 0 => msg!("The power is now off!"),
  25. _ => panic!("Invalid boolean value"),
  26. };
  27. Ok(())
  28. }