aboutsummaryrefslogtreecommitdiff
path: root/src/shared/settings/Properties.ts
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2019-10-07 12:54:32 +0000
committerGitHub <noreply@github.com>2019-10-07 12:54:32 +0000
commit8eddcc1785a85bbe74be254d1055ebe5125dad10 (patch)
treef3f51320d12a90a1b421ed8b1f811c576996ea8e /src/shared/settings/Properties.ts
parent7fc2bb615f530fc6adfade54b9553568f5d50ceb (diff)
parentb77a4734985722e96066e713f3b1b9e81a6e1811 (diff)
Merge pull request #654 from ueokande/settings-as-a-class
Refactor settings on shared logics
Diffstat (limited to 'src/shared/settings/Properties.ts')
-rw-r--r--src/shared/settings/Properties.ts110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/shared/settings/Properties.ts b/src/shared/settings/Properties.ts
new file mode 100644
index 0000000..63ff991
--- /dev/null
+++ b/src/shared/settings/Properties.ts
@@ -0,0 +1,110 @@
+export type PropertiesJSON = {
+ hintchars?: string;
+ smoothscroll?: boolean;
+ complete?: string;
+};
+
+export type PropertyTypes = {
+ hintchars: string;
+ smoothscroll: string;
+ complete: string;
+};
+
+type PropertyName = 'hintchars' | 'smoothscroll' | 'complete';
+
+type PropertyDef = {
+ name: PropertyName;
+ description: string;
+ defaultValue: string | number | boolean;
+ type: 'string' | 'number' | 'boolean';
+};
+
+const defs: PropertyDef[] = [
+ {
+ name: 'hintchars',
+ description: 'hint characters on follow mode',
+ defaultValue: 'abcdefghijklmnopqrstuvwxyz',
+ type: 'string',
+ }, {
+ name: 'smoothscroll',
+ description: 'smooth scroll',
+ defaultValue: false,
+ type: 'boolean',
+ }, {
+ name: 'complete',
+ description: 'which are completed at the open page',
+ defaultValue: 'sbh',
+ type: 'string',
+ }
+];
+
+const defaultValues = {
+ hintchars: 'abcdefghijklmnopqrstuvwxyz',
+ smoothscroll: false,
+ complete: 'sbh',
+};
+
+export default class Properties {
+ public hintchars: string;
+
+ public smoothscroll: boolean;
+
+ public complete: string;
+
+ constructor({
+ hintchars,
+ smoothscroll,
+ complete,
+ }: {
+ hintchars?: string;
+ smoothscroll?: boolean;
+ complete?: string;
+ } = {}) {
+ this.hintchars = hintchars || defaultValues.hintchars;
+ this.smoothscroll = smoothscroll || defaultValues.smoothscroll;
+ this.complete = complete || defaultValues.complete;
+ }
+
+ static fromJSON(json: any): Properties {
+ let defNames: Set<string> = new Set(defs.map(def => def.name));
+ let unknownName = Object.keys(json).find(name => !defNames.has(name));
+ if (unknownName) {
+ throw new TypeError(`Unknown property name: "${unknownName}"`);
+ }
+
+ for (let def of defs) {
+ if (!Object.prototype.hasOwnProperty.call(json, def.name)) {
+ continue;
+ }
+ if (typeof json[def.name] !== def.type) {
+ throw new TypeError(
+ `property "${def.name}" is not ${def.type}`);
+ }
+ }
+ return new Properties(json);
+ }
+
+ static types(): PropertyTypes {
+ return {
+ hintchars: 'string',
+ smoothscroll: 'boolean',
+ complete: 'string',
+ };
+ }
+
+ static def(name: string): PropertyDef | undefined {
+ return defs.find(p => p.name === name);
+ }
+
+ static defs(): PropertyDef[] {
+ return defs;
+ }
+
+ toJSON(): PropertiesJSON {
+ return {
+ hintchars: this.hintchars,
+ smoothscroll: this.smoothscroll,
+ complete: this.complete,
+ };
+ }
+}