rosavox/source/helpers/storage-jsonfile.php

154 lines
2.3 KiB
PHP

<?php
namespace rosavox\helpers\storage;
require_once('helpers/storage-interface.php');
/**
*/
class class_jsonfile implements interface_/*<int,any>*/
{
/**
*/
private string $path;
/**
*/
private \Closure $id_encode;
/**
*/
private \Closure $id_decode;
/**
*/
public function __construct(
string $path,
\Closure $id_encode,
\Closure $id_decode
)
{
$this->path = $path;
$this->id_encode = $id_encode;
$this->id_decode = $id_decode;
}
/**
*/
private function get() : array
{
$content = (\file_exists($this->path) ? \file_get_contents($this->path) : null);
return (
($content === null)
?
['last_id' => 0, 'entries' => []]
:
\json_decode($content, true)
);
}
/**
*/
private function put(array $data) : void
{
$content = \json_encode($data, \JSON_PRETTY_PRINT);
\file_put_contents($this->path, $content);
}
/**
*/
public function setup() : void
{
// do nothing
}
/**
*/
public function list_() : array
{
$data = $this->get();
return \array_map(
fn ($id_encoded) => [
'id' => ($this->id_decode)($id_encoded),
'value' => $data['entries'][$id_encoded],
],
\array_keys($data['entries'])
);
}
/**
*/
public function read($id)
{
$data = $this->get();
$id_encoded = ($this->id_encode)($id);
if (! \array_key_exists($id_encoded, $data['entries']))
{
throw (new \Exception('not found'));
}
else
{
return $data['entries'][$id_encoded];
}
}
public function create($value)
{
$data = $this->get();
$id = ($data['last_id'] + 1);
$id_encoded = ($this->id_encode)($id);
$data['last_id'] = $id;
$data['entries'][$id_encoded] = $value;
$this->put($data);
return $id;
}
/**
*/
public function update($id, $value) : void
{
$data = $this->get();
$id_encoded = ($this->id_encode)($id);
if (! \array_key_exists($id_encoded, $data['entries']))
{
throw (new \Exception('not found'));
}
else
{
$data['entries'][$id_encoded] = $value;
$this->put($data);
}
}
/**
*/
public function delete($id) : void
{
$data = $this->get();
$id_encoded = ($this->id_encode)($id);
if (! \array_key_exists($id_encoded, $data['entries']))
{
throw (new \Exception('not found'));
}
else
{
unset($data['entries'][$id_encoded]);
$this->put($data);
}
}
}
?>