Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

40 Zeilen
731B

  1. use std::{ffi::CStr, os::raw::c_char};
  2. #[derive(Debug)]
  3. pub struct ErrNoProperty {
  4. name: String,
  5. }
  6. impl std::fmt::Display for ErrNoProperty {
  7. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  8. write!(f, "{} not available", self.name)
  9. }
  10. }
  11. impl std::error::Error for ErrNoProperty {}
  12. pub fn ensure_properties<T, F>(
  13. props: &[T],
  14. names: &[*const c_char],
  15. func: F,
  16. ) -> Result<(), ErrNoProperty>
  17. where
  18. F: Fn(&T) -> *const c_char,
  19. {
  20. for name in names {
  21. let name = unsafe { CStr::from_ptr(*name) };
  22. let any =
  23. props.iter().any(|x| unsafe { CStr::from_ptr(func(x)) == name });
  24. if !any {
  25. return Err(ErrNoProperty {
  26. name: name.to_string_lossy().to_string(),
  27. });
  28. }
  29. }
  30. Ok(())
  31. }
  32. // EOF