Elements.vala 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Invercargill;
  2. namespace InvercargillJson {
  3. public interface JsonElements : Enumerable<JsonElement>, Elements {
  4. public virtual Enumerable<JsonArray> as_arrays() {
  5. return select<JsonArray>(n => new JsonArray.from_existing(n.assert_as<Json.Node>().get_array()));
  6. }
  7. public virtual Enumerable<bool> as_bools() {
  8. return select<bool>(n => n.assert_as<Json.Node>().get_boolean());
  9. }
  10. public virtual Doubles as_doubles() {
  11. return select<double?>(n => n.assert_as<Json.Node>().get_double()).promote_to<Doubles>();
  12. }
  13. public virtual Signed64BitIntegers as_integers() {
  14. return select<int64?>(n => n.assert_as<Json.Node>().get_int()).promote_to<Signed64BitIntegers>();
  15. }
  16. public virtual Enumerable<string> as_strings() {
  17. return select<string>(n => n.assert_as<Json.Node>().get_string());
  18. }
  19. public virtual Enumerable<JsonObject> as_objects() {
  20. return select<JsonObject>(n => new JsonObject.from_existing(n.assert_as<Json.Node>().get_object()));
  21. }
  22. public virtual JsonArray to_json_array() {
  23. var array = new JsonArray();
  24. array.add_all((Enumerable<JsonElement>)this);
  25. return array;
  26. }
  27. }
  28. private class JsonElementsPromotionImplementation : Object, Promotion<Element> {
  29. public bool can_wrap(GLib.Type element_type) {
  30. return element_type.is_a(typeof(JsonElement));
  31. }
  32. public Enumerable<Element> wrap(Enumerable<Element> enumerable) {
  33. return new JsonElementsProxy(enumerable.cast<JsonElement>());
  34. }
  35. }
  36. private class JsonElementsProxy : ProxyEnumerable<JsonElement>, Elements, JsonElements {
  37. public JsonElementsProxy(Enumerable<JsonElement> elements) {
  38. inner = elements;
  39. }
  40. }
  41. }