Guest User

Untitled

a guest
Oct 18th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.84 KB | None | 0 0
  1. use serde::de::{Deserialize, Deserializer};
  2. use serde_derive::Deserialize;
  3.  
  4. macro_rules! define_matrix_entry {
  5. ($name:ident, ($run_default:expr, $version_default:expr, $allow_failure_default:expr)) => {
  6. #[derive(Debug)]
  7. struct $name<'a> {
  8. run: bool,
  9. version: &'a str,
  10. allow_failure: bool,
  11. }
  12.  
  13. impl<'a> Default for $name<'a> {
  14. fn default() -> Self {
  15. $name {
  16. run: $run_default,
  17. version: $version_default,
  18. allow_failure: $allow_failure_default,
  19. }
  20. }
  21. }
  22.  
  23. // Since we can't easily (or at all?) pass default expresisons
  24. // to serde, we have to define our own
  25. // deserializer. Thankfully, you can deserialize into an
  26. // intermediate struct and then assign / default the values
  27. // from Default::default().
  28. impl<'de: 'a, 'a> Deserialize<'de> for $name<'a> {
  29. fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  30. where
  31. D: Deserializer<'de>,
  32. {
  33. #[derive(Deserialize)]
  34. struct DeserializationStruct<'a> {
  35. run: Option<bool>,
  36. version: Option<&'a str>,
  37. allow_failure: Option<bool>,
  38. }
  39. let raw: DeserializationStruct = DeserializationStruct::deserialize(deserializer)?;
  40. let res = $name {
  41. run: raw.run.unwrap_or(Self::default().run),
  42. version: raw.version.unwrap_or(Self::default().version),
  43. allow_failure: raw.allow_failure.unwrap_or(Self::default().allow_failure),
  44. };
  45. Ok(res)
  46. }
  47. }
  48. };
  49. }
  50.  
  51. define_matrix_entry!(BenchEntry, (false, "nightly", false));
Add Comment
Please, Sign In to add comment