uci-berry-utils/file.be

139 lines
3.0 KiB
Plaintext

# load and save a json file
import json
# ##########################
# uncomment on dev machine, commented on esp
# import os
# path=os.path
import path # uncommented on esp, commented on dev
import string
#############################
class File
var _filename
var _ext
# must use nil for filename if only setting extension
def init(filename,ext)
self._ext = ext ? '.'+str(ext) : '.json'
self._filename = self.addext(filename)
end
def addext(filename)
if !filename filename=self._filename end
# print ('extension', self._ext, filename)
var name = string.find(filename,'.') < 0 ? filename+self._ext : filename
return name
end
def delete(filename)
filename = filename ? self.addext(filename) : self._filename
if path.remove(filename)
print('deleted file', filename)
else
print('unable to delte file', filename)
end
end
def name(filename)
if filename self._filename = self.addext(filename) end
return self._filename
end
# returns parsed json
def load(filename)
filename = filename ? self.addext(filename) : self._filename
var f # file object
if path.exists(filename)
var obj
try
f = open(filename, "r")
obj = json.load(f.read())
f.close()
except .. as e, m
if f != nil f.close() end
raise e, m
end
if debug[1]
print ('=============')
print ('loaded file ',filename, '. Returning parsed object')
print (obj)
print ('=============')
end
return obj
else
print('Warning: file does not exist, nothing loaded', filename)
end
return nil
end
# obj is requried
def save(obj,filename)
if ! obj
print('ERROR: must pass a object to save as json')
return nil
end
filename = filename ? self.addext(filename) : self._filename
if ! filename
print('ERROR: no filename set to save object as json')
return nil
end
var f # file object
try
f = open(filename, "w")
self._json_fdump_any(f,obj)
f.close()
except .. as e, m
if f != nil f.close() end
f.close()
raise e, m
end
if debug[3] print('success writing to file',filename) end
end
# internal utility methods
def _json_fdump_map(f, v)
f.write('{')
var sep = nil
for k:v.keys()
if sep != nil f.write(sep) end
f.write(json.dump(str(k)))
f.write(':')
self._json_fdump_any(f, v[k])
sep = ","
end
f.write('}')
end
def _json_fdump_list(f, v)
f.write('[')
var i = 0
while i < size(v)
if i > 0 f.write(',') end
self._json_fdump_any(f, v[i])
i += 1
end
f.write(']')
end
def _json_fdump_any(f, v)
import json
if isinstance(v, map)
self._json_fdump_map(f, v)
elif isinstance(v, list)v
self._json_fdump_list(f, v)
else
f.write(json.dump(v))
end
end
end # FILE class
var file = module('file')
# file.create = File
file = File
return file