Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 26 additions & 5 deletions src/main/php/text/json/Json.class.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
<?php namespace text\json;

use io\File;
use io\streams\{InputStream, OutputStream};
use lang\IllegalArgumentException;

/**
* Simple entry point class
*
Expand All @@ -11,25 +15,42 @@ abstract class Json {
/**
* Reads from an input
*
* @param string|text.json.Input $input
* @param string|text.json.Input|io.File|io.stream.InputStream $input
* @return var
*/
public static function read($input) {
if ($input instanceof Input) {
return $input->read();
// NOOP
} else if ($input instanceof File) {
$input= new FileInput($input);
} else if ($input instanceof InputStream) {
$input= new StreamInput($input);
} else {
return (new StringInput($input))->read();
$input= new StringInput((string)$input);
}

return $input->read();
}

/**
* Writes to an output and returns the output
*
* @param var $value
* @param text.json.Output $output
* @param text.json.Output|io.File|io.stream.OutputStream $output
* @return text.json.Output The given output
* @throws lang.IllegalArgumentException
*/
public static function write($value, Output $output) {
public static function write($value, $output) {
if ($output instanceof Output) {
// NOOP
} else if ($output instanceof File) {
$output= new FileOutput($output);
} else if ($output instanceof OutputStream) {
$output= new StreamOutput($output);
} else {
throw new IllegalArgumentException('Expected an Output, File or OutputStream, have '.typeof($output));
}

$output->write($value);
return $output;
}
Expand Down
45 changes: 44 additions & 1 deletion src/test/php/text/json/unittest/JsonTest.class.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
<?php namespace text\json\unittest;

use lang\FormatException;
use io\streams\{MemoryInputStream, MemoryOutputStream};
use io\{Files, TempFile};
use lang\{FormatException, IllegalArgumentException};
use test\{Assert, Expect, Test};
use text\json\{Format, Json, StringInput, StringOutput};
use util\Bytes;

class JsonTest {

Expand All @@ -16,6 +19,26 @@ public function read_string() {
Assert::equals('Test', Json::read('"Test"'));
}

#[Test]
public function read_casts_input_to_string() {
Assert::equals('Test', Json::read(new Bytes('"Test"')));
}

#[Test]
public function read_file() {
$file= new TempFile();
try {
Assert::equals('Test', Json::read($file->containing('"Test"')));
} finally {
$file->unlink();
}
}

#[Test]
public function read_stream() {
Assert::equals('Test', Json::read(new MemoryInputStream('"Test"')));
}

#[Test, Expect(FormatException::class)]
public function read_malformed_string() {
Json::read('this.is.not.json');
Expand All @@ -31,6 +54,26 @@ public function write_output() {
Assert::equals('"Test"', Json::write('Test', new StringOutput())->bytes());
}

#[Test]
public function write_file() {
$file= new TempFile();
try {
Assert::equals('"Test"', Files::read(Json::write('Test', $file)->file()));
} finally {
$file->unlink();
}
}

#[Test]
public function write_stream() {
Assert::equals('"Test"', Json::write('Test', new MemoryOutputStream())->stream()->bytes());
}

#[Test, Expect(IllegalArgumentException::class)]
public function write_incorrect_type() {
Json::write('Test', $this);
}

#[Test]
public function of_string() {
Assert::equals('"Test"', Json::of('Test'));
Expand Down
Loading