#
# ## Usage
#
-# Create a new JsonStore or reuse an existing one.
+# ### Initialization
+#
+# JsonStore use the file system to store and load json files.
+#
+# For initialization you need to give the directory used in the
+# file system to save objects.
+#
# ~~~
# var store = new JsonStore("store_dir")
# ~~~
#
-# JsonStore can store json of type JsonObject and JsonArray.
+# ### Documents
+#
+# With JsonStore you manage *documents*.
+# Documents are simple json files that can be stored and loaded from json store.
+#
+# JsonStore can store documents of type JsonObject and JsonArray.
# ~~~
-# var red = "red"
-# var obj = new JsonObject
-# obj["color"] = red
-# obj["code"] = "FF0000"
+# var red = new JsonObject
+# red["name"] = "red"
+# red["code"] = "FF0000"
# ~~~
#
-# Data are stored under a key.
+# Data are stored under a *key*.
+# This is the path to the document from `JsonStore::store_dir`
+# without the `.json` extension.
+#
+# Examples:
+#
+# * key `document` will store data under `store_dir / "document.json"`
+# * key `collection/data` will store data under `store_dir / "collection/data.json"`
+#
# ~~~
-# var key = "colors/{red}"
+# var key = "colors/red"
# ~~~
#
# Store the object.
# ~~~
-# store.store_object(key, obj)
-# assert store.has_key(key)
+# store.store_object(key, red)
# ~~~
#
# Load the object.
# ~~~
-# var res = store.load_object(key)
-# assert res["name"] == red
+# assert store.has_key(key)
+# var obj = store.load_object(key)
+# assert obj["name"] == obj["name"]
+# ~~~
+#
+# ### Collections
+#
+# A collection is a set of documents stored under the same path.
+#
+# ~~~
+# var green = new JsonObject
+# green["name"] = "green"
+# green["code"] = "00FF00"
+# store.store_object("colors/green", green)
+#
+# assert store.has_collection("colors")
+#
+# var col = store.list_collection("colors")
+# assert col.length == 2
+# assert col.has("green")
+# assert col.has("red")
# ~~~
#
-# Clear all stored data.
+# ### Clearing store
+#
+# You can delete all the data contained in the `JsonStore::store_dir` with `clear`.
+#
# ~~~
# store.clear
# ~~~
import static
# A JsonStore can save and load json data from file system.
-#
-# Json files are stored under a `key`.
-# This key represents the path to the json file from `store_dir`
-# without the `.json` extension.
-#
-# Examples:
-#
-# * key `document` will store data under `store_dir / "document.json"`
-# * key `collection/data` will store data under `store_dir / "collection/data.json"`
class JsonStore
# Directory where data are stored.
private fun store_json(key: String, json: Jsonable) do
var path = store_dir / "{key}.json"
path.dirname.mkdir
- var file = new OFStream.open(path)
+ var file = new FileWriter.open(path)
file.write(json.to_json)
file.close
end
private fun load_json(key: String): nullable Jsonable do
assert has_key(key)
var path = store_dir / "{key}.json"
- var file = new IFStream.open(path)
+ var file = new FileReader.open(path)
var text = file.read_all
file.close
return text.parse_json
end
+
+ # Get the list of keys stored under the collection `key`.
+ fun list_collection(key: String): JsonArray do
+ var res = new JsonArray
+ var coll = (store_dir / "{key}").to_path
+ if not coll.exists or not coll.stat.is_dir then return res
+ for file in coll.files do
+ if file.to_s.has_suffix(".json") then
+ res.add(file.to_s.basename(".json"))
+ end
+ end
+ return res
+ end
+
+ # Does `key` matches a collection?
+ fun has_collection(key: String): Bool do
+ var path = (store_dir / "{key}").to_path
+ return path.exists and path.stat.is_dir
+ end
end