rosavox/source/helpers/storage.php

128 lines
2.3 KiB
PHP

<?php
namespace rosavox\helpers\storage;
/**
*/
interface interface_
{
public function list_() : array;
public function read(int $id);
public function create($value) : int;
public function update(int $id, $value) : void;
public function delete(int $id) : void;
}
/**
*/
class class_jsonfile implements interface_
{
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 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(int $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) : int
{
$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(int $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(int $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);
}
}
}
?>