diff --git a/src/ControlPanel.ts b/src/ControlPanel.ts index d3e6d9e..6838ac0 100644 --- a/src/ControlPanel.ts +++ b/src/ControlPanel.ts @@ -12,7 +12,7 @@ import Vue from 'vue'; import Vuex from 'vuex'; import DashboardApp from './DashboardView/Dashboard.vue'; import { ConsoleLogger, Logger } from './Logger'; -import { DataStorage } from './DataStorage'; +import { DataStorage } from './Storage/DataStorage'; import { getBuildingPageAttributes, isBuildingPage } from './Page/PageDetector'; import { ExecutionStorage } from './Storage/ExecutionStorage'; import { VillageState } from './VillageState'; diff --git a/src/Queue/ActionQueue.ts b/src/Queue/ActionQueue.ts index 1ebff1e..4d0710d 100644 --- a/src/Queue/ActionQueue.ts +++ b/src/Queue/ActionQueue.ts @@ -1,5 +1,5 @@ import { ConsoleLogger, Logger } from '../Logger'; -import { DataStorage } from '../DataStorage'; +import { DataStorage } from '../Storage/DataStorage'; import { Args } from './Args'; const NAMESPACE = 'actions.v1'; diff --git a/src/Queue/DataStorageTaskProvider.ts b/src/Queue/DataStorageTaskProvider.ts index e27d95a..fbf19f2 100644 --- a/src/Queue/DataStorageTaskProvider.ts +++ b/src/Queue/DataStorageTaskProvider.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from '../Storage/DataStorage'; import { Task, TaskList, TaskProvider, uniqTaskId } from './TaskProvider'; const QUEUE_NAME = 'queue'; diff --git a/src/DataStorage.ts b/src/Storage/DataStorage.ts similarity index 69% rename from src/DataStorage.ts rename to src/Storage/DataStorage.ts index 65929f5..be88daa 100644 --- a/src/DataStorage.ts +++ b/src/Storage/DataStorage.ts @@ -1,4 +1,5 @@ -import { Logger, NullLogger } from './Logger'; +import { Logger, NullLogger } from '../Logger'; +import { createMapper, ObjectMapperOptions } from './Mapper'; const NAMESPACE = 'travian:v1'; @@ -8,40 +9,6 @@ function join(...parts: Array) { return parts.map(p => p.replace(/[:]+$/g, '').replace(/^[:]+/g, '')).join(':'); } -interface EmptyObjectFactory { - (): T; -} - -interface ObjectMapper { - (item: any): T; -} - -interface ObjectMapperOptions { - factory?: EmptyObjectFactory; - mapper?: ObjectMapper; -} - -function createMapper(options: ObjectMapperOptions): ObjectMapper { - const { mapper, factory } = options; - - if (mapper) { - return mapper; - } - - if (factory) { - return plain => { - let item = factory(); - if (typeof plain === 'object' && typeof item === 'object') { - return Object.assign(item, plain) as T; - } else { - return item; - } - }; - } - - throw new Error('Factory or mapper must be specified'); -} - export class DataStorage { private readonly logger: Logger; private readonly name: string; diff --git a/src/Storage/ExecutionStorage.ts b/src/Storage/ExecutionStorage.ts index 961f495..fd6dfc3 100644 --- a/src/Storage/ExecutionStorage.ts +++ b/src/Storage/ExecutionStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { ExecutionSettings } from '../Executor'; const NAMESPACE = 'execution.v1'; diff --git a/src/Storage/HeroStorage.ts b/src/Storage/HeroStorage.ts index 6a94885..d80fc91 100644 --- a/src/Storage/HeroStorage.ts +++ b/src/Storage/HeroStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { HeroAttributes } from '../Core/Hero'; const VILLAGE_ID_KEY = 'village_id'; diff --git a/src/Storage/LogStorage.ts b/src/Storage/LogStorage.ts index becdd98..1519d89 100644 --- a/src/Storage/LogStorage.ts +++ b/src/Storage/LogStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { LogStorageInterface, StorageLogRecord } from '../Logger'; const RECORD_LIST_KEY = 'records'; diff --git a/src/Storage/Mapper.ts b/src/Storage/Mapper.ts new file mode 100644 index 0000000..8ca351d --- /dev/null +++ b/src/Storage/Mapper.ts @@ -0,0 +1,33 @@ +interface EmptyObjectFactory { + (): T; +} + +interface ObjectMapper { + (item: any): T; +} + +export interface ObjectMapperOptions { + factory?: EmptyObjectFactory; + mapper?: ObjectMapper; +} + +export function createMapper(options: ObjectMapperOptions): ObjectMapper { + const { mapper, factory } = options; + + if (mapper) { + return mapper; + } + + if (factory) { + return plain => { + let item = factory(); + if (typeof plain === 'object' && typeof item === 'object') { + return Object.assign(item, plain) as T; + } else { + return item; + } + }; + } + + throw new Error('Factory or mapper must be specified'); +} diff --git a/src/Storage/ResourceTransferStorage.ts b/src/Storage/ResourceTransferStorage.ts index d132fde..587dcef 100644 --- a/src/Storage/ResourceTransferStorage.ts +++ b/src/Storage/ResourceTransferStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { ResourceTransferReport } from '../ResourceTransfer'; const NAMESPACE = 'resource_transfer.v1'; diff --git a/src/Storage/StatisticsStorage.ts b/src/Storage/StatisticsStorage.ts index bd2cc41..e049128 100644 --- a/src/Storage/StatisticsStorage.ts +++ b/src/Storage/StatisticsStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { ActionStatistics, StatisticsStorageInterface } from '../Statistics'; const ACTION_STATISTICS_KEY = 'actions'; diff --git a/src/Storage/StorageContainer.ts b/src/Storage/StorageContainer.ts index d483b57..f2f5c3e 100644 --- a/src/Storage/StorageContainer.ts +++ b/src/Storage/StorageContainer.ts @@ -1,5 +1,5 @@ import { LogStorage } from './LogStorage'; -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { StatisticsStorage } from './StatisticsStorage'; export class StorageContainer { diff --git a/src/Storage/VillageStorage.ts b/src/Storage/VillageStorage.ts index aeef924..26455ec 100644 --- a/src/Storage/VillageStorage.ts +++ b/src/Storage/VillageStorage.ts @@ -1,4 +1,4 @@ -import { DataStorage } from '../DataStorage'; +import { DataStorage } from './DataStorage'; import { Resources, ResourcesInterface } from '../Core/Resources'; import { ResourceStorage } from '../Core/ResourceStorage'; import { IncomingMerchant, MerchantsInfo } from '../Core/Market';