Add file storage

This commit is contained in:
2019-11-04 21:58:28 +03:00
parent 41176c7a1f
commit 73ed1eca06
4 changed files with 82 additions and 25 deletions

View File

@ -2,30 +2,57 @@ require "json"
module Dayoff
abstract class Storage
abstract def get_planned_dates : Array(PlannedDate)
abstract def set_planned_dates(items : Array(PlannedDate))
abstract def get_work_records : Array(WorkRecord)
abstract def set_work_records(items : Array(WorkRecord))
macro st_abstract_def(name, dtype)
abstract def get_{{name}} : Array({{dtype}})
abstract def set_{{name}}(items : Array({{dtype}}))
end
st_abstract_def(planned_dates, PlannedDate)
st_abstract_def(work_records, WorkRecord)
end
class MemoryStorage < Storage
@planned_dates = [] of PlannedDate
@work_records = [] of WorkRecord
macro st_memory_def(name, dtype)
@{{name}} = [] of {{dtype}}
def get_planned_dates : Array(PlannedDate)
@planned_dates
def get_{{name}} : Array({{dtype}})
@{{name}}
end
def set_{{name}}(items : Array({{dtype}}))
@{{name}} = items
end
end
def set_planned_dates(items : Array(PlannedDate))
@planned_dates = items
st_memory_def(planned_dates, PlannedDate)
st_memory_def(work_records, WorkRecord)
end
class FileStorage < Storage
def initialize(@path : String)
end
def get_work_records : Array(WorkRecord)
@work_records
macro st_file_def(name, dtype, file)
@{{name}} = [] of {{dtype}}
def get_{{name}} : Array({{dtype}})
fname = File.join(@path, {{file}})
if File.exists? fname
content = File.read(fname)
Array({{dtype}}).from_json content
else
[] of {{dtype}}
end
end
def set_{{name}}(items : Array({{dtype}}))
fname = File.join(@path, {{file}})
content = items.to_pretty_json
File.write fname, content
end
end
def set_work_records(items : Array(WorkRecord))
@work_records = items
end
st_file_def(planned_dates, PlannedDate, "planed-dates.json")
st_file_def(work_records, WorkRecord, "work_records.json")
end
end