map.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package cc
  2. const mapTpl = `
  3. {{ $f := .Field }}{{ $r := .Rules }}
  4. {{ if $r.GetIgnoreEmpty }}
  5. if ({{ accessor . }}.size() > 0) {
  6. {{ end }}
  7. {{ if $r.GetMinPairs }}
  8. {
  9. const auto size = {{ accessor . }}.size();
  10. {{ if eq $r.GetMinPairs $r.GetMaxPairs }}
  11. if (size != {{ $r.GetMinPairs }}) {
  12. {{ err . "value must contain exactly " $r.GetMinPairs " pair(s)" }}
  13. }
  14. {{ else if $r.MaxPairs }}
  15. if (size < {{ $r.GetMinPairs }} || size > {{ $r.GetMaxPairs }}) {
  16. {{ err . "value must contain between " $r.GetMinPairs " and " $r.GetMaxPairs " pairs, inclusive" }}
  17. }
  18. {{ else }}
  19. if (size < {{ $r.GetMinPairs }}) {
  20. {{ err . "value must contain at least " $r.GetMinPairs " pair(s)" }}
  21. }
  22. {{ end }}
  23. }
  24. {{ else if $r.MaxPairs }}
  25. {
  26. const auto size = {{ accessor . }}.size();
  27. if (size > {{ $r.GetMaxPairs }}) {
  28. {{ err . "value must contain no more than " $r.GetMaxPairs " pair(s)" }}
  29. }
  30. }
  31. {{ end }}
  32. {{ if or $r.GetNoSparse (ne (.Elem "" "").Typ "none") (ne (.Key "" "").Typ "none") }}
  33. for (const auto& kv : {{ accessor . }}) {
  34. const auto& key = kv.first;
  35. const auto& val = kv.second;
  36. (void)key;
  37. (void)val;
  38. {{ render (.Key "key" "key") }}
  39. {{ render (.Elem "val" "key") }}
  40. }
  41. {{ if $r.GetNoSparse }}
  42. {{ unimplemented "no_sparse validation is not implemented for C++ because protobuf maps cannot be sparse in C++" }}
  43. {{ end }}
  44. {{ end }}
  45. {{ if $r.GetIgnoreEmpty }}
  46. }
  47. {{ end }}
  48. `