aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/api.ts16
-rw-r--r--core/direct/client.ts11
-rw-r--r--core/http/client.ts31
-rw-r--r--core/http/props.ts10
-rw-r--r--core/http/server.ts33
-rw-r--r--core/raw/api.ts27
6 files changed, 128 insertions, 0 deletions
diff --git a/core/api.ts b/core/api.ts
new file mode 100644
index 0000000..0891081
--- /dev/null
+++ b/core/api.ts
@@ -0,0 +1,16 @@
+import { ParseResult } from "../language/types.ts";
+
+/**
+ * @summary API interface
+ *
+ * This interface gets implemented by all API clients, so clients can be
+ * swapped easily.
+ */
+export default abstract class API {
+ /** @summary prepare API client */
+ abstract prepare(): Promise<void>;
+
+ /** @summary parse sentence */
+ abstract parseSentence(input: string): Promise<ParseResult>;
+};
+
diff --git a/core/direct/client.ts b/core/direct/client.ts
new file mode 100644
index 0000000..fda4b60
--- /dev/null
+++ b/core/direct/client.ts
@@ -0,0 +1,11 @@
+import API from "../api.ts";
+import YomikunRAWAPI from "../raw/api.ts";
+
+/**
+ * @summary Yomikun direct API
+ *
+ * Alias to YomikunRAWAPI. calls API methods directly, and thus only works
+ * server-side. Used to test the API locally without HTTP overhead.
+ */
+export default class YomikunDirectAPIClient extends YomikunRAWAPI implements API { }
+
diff --git a/core/http/client.ts b/core/http/client.ts
new file mode 100644
index 0000000..42d75f0
--- /dev/null
+++ b/core/http/client.ts
@@ -0,0 +1,31 @@
+import { ParseDepth, ParseResult } from "../../language/types.ts";
+import YomikunError from "../../util/error.ts";
+import API from "../api.ts";
+import { ConnectionProps, ConnectionPropsDefault } from "./props.ts";
+
+/**
+ * @summary Yomikun HTTP API
+ *
+ * Uses the Yomikun server to call API methods. Handles (de)serialization
+ * automatically.
+ */
+export default class YomikunRemoteAPIClient implements API {
+ private props: ConnectionProps;
+
+ constructor(options?: ConnectionProps) {
+ this.props = { ...ConnectionPropsDefault, ...options };
+ }
+
+ async prepare() { }
+
+ async parseSentence(input: string) {
+ var response = await fetch(`http://${this.props.host}:${this.props.port}/parseSentence`);
+ console.log(response.body);
+
+ return {
+ depth: ParseDepth.Term,
+ tokens: [],
+ } as ParseResult;
+ }
+}
+
diff --git a/core/http/props.ts b/core/http/props.ts
new file mode 100644
index 0000000..d69ae55
--- /dev/null
+++ b/core/http/props.ts
@@ -0,0 +1,10 @@
+export interface ConnectionProps {
+ host: string;
+ port: number;
+};
+
+export const ConnectionPropsDefault: ConnectionProps = {
+ host: "localhost",
+ port: 9400,
+};
+
diff --git a/core/http/server.ts b/core/http/server.ts
new file mode 100644
index 0000000..8a6786e
--- /dev/null
+++ b/core/http/server.ts
@@ -0,0 +1,33 @@
+import { serve } from "https://deno.land/std@0.192.0/http/server.ts";
+
+import { ParseResult } from "../../language/types.ts";
+import YomikunRAWAPI from "../raw/api.ts";
+import { ConnectionProps, ConnectionPropsDefault } from "./props.ts";
+
+interface Endpoint {
+ endpoint: string;
+};
+
+export default class YomikunRemoteAPIServer extends YomikunRAWAPI {
+ private props: ConnectionProps;
+
+ constructor(options?: ConnectionProps) {
+ super();
+ this.props = { ...ConnectionPropsDefault, ...options };
+ }
+
+ async parseSentence(input: string) {
+ return await super.parseSentence(input);
+ }
+
+ async start() {
+ serve((req) => {
+ return new Response("Hello world!");
+ }, { port: this.props.port });
+ }
+
+ async prepare() {
+ await super.prepare();
+ }
+}
+
diff --git a/core/raw/api.ts b/core/raw/api.ts
new file mode 100644
index 0000000..2d29eed
--- /dev/null
+++ b/core/raw/api.ts
@@ -0,0 +1,27 @@
+import API from "../api.ts";
+import Parser from "../../language/parser.ts";
+import YomikunError from "../../util/error.ts";
+
+/** @summary internal Yomikun API client (DO NOT USE DIRECTLY) */
+export default class YomikunRAWAPI implements API {
+ private _parser: Parser;
+
+ constructor() {
+ if (this.constructor === YomikunRAWAPI) {
+ throw new YomikunError("YomikunRAWAPI instantiated! please use YomikunDirectAPIClient instead");
+ }
+
+ this._parser = new Parser();
+ }
+
+ async prepare() {
+ await Promise.all([
+ this._parser.prepare(),
+ ]);
+ }
+
+ async parseSentence(input: string) {
+ return this._parser.parse(input);
+ }
+};
+