Skip to content

Commit

Permalink
fix
Browse files Browse the repository at this point in the history
  • Loading branch information
OlivierZal committed Jul 2, 2024
1 parent 9218cce commit dc9db45
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 20 deletions.
51 changes: 33 additions & 18 deletions src/facades/device.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
type UpdateDeviceData,
type Values,
flags,
keys,
} from '../types'
import { YEAR_1970, nowISO } from './utils'
import type API from '../services'
Expand All @@ -19,8 +20,8 @@ import type { IDeviceFacade } from './interfaces'

// @ts-expect-error: most runtimes do not support it natively
Symbol.metadata ??= Symbol('Symbol.metadata')
const keySymbol = Symbol('value')
const setDataSymbol = Symbol('setData')
const valueSymbol = Symbol('value')

export const mapTo =
<
Expand All @@ -35,13 +36,12 @@ export const mapTo =
context: ClassAccessorDecoratorContext<This>,
): ClassAccessorDecoratorResult<This, unknown> => ({
get(this: This): unknown {
const value = String(context.name)
const key = String(context.name)
context.metadata[keySymbol] ??= {}
;(context.metadata[keySymbol] as Record<string, string>)[key] = setData
context.metadata[setDataSymbol] ??= {}
;(context.metadata[setDataSymbol] as Record<string, string>)[setData] =
value
context.metadata[valueSymbol] ??= {}
;(context.metadata[valueSymbol] as Record<string, string>)[value] =
setData
key
return setData in this.data ?
this.data[setData as keyof typeof this.data]
: null
Expand All @@ -65,23 +65,18 @@ export default abstract class<T extends keyof typeof DeviceType>

readonly #flags: Record<NonFlagsKeyOf<UpdateDeviceData[T]>, number>

readonly #setDataMapping = this.constructor[Symbol.metadata]?.[
setDataSymbol
] as Record<NonFlagsKeyOf<UpdateDeviceData[T]>, keyof Values[T]>

readonly #type: T

readonly #valueMapping = this.constructor[Symbol.metadata]?.[
valueSymbol
] as Record<keyof Values[T], NonFlagsKeyOf<UpdateDeviceData[T]>>

public constructor(api: API, model: DeviceModel<T>) {
super(api, model as DeviceModelAny)
this.#type = model.type
this.#flags = flags[this.#type] as Record<
NonFlagsKeyOf<UpdateDeviceData[T]>,
number
>
keys[this.#type]
.filter((key) => key in this)
.forEach((key) => this[key as keyof typeof this])
}

@mapTo('Power')
Expand All @@ -93,14 +88,14 @@ export default abstract class<T extends keyof typeof DeviceType>

public get values(): Values[T] {
return Object.fromEntries(
Object.entries(
this.constructor[Symbol.metadata]?.[valueSymbol] as Record<
Object.keys(
this.constructor[Symbol.metadata]?.[keySymbol] as Record<
string,
string
>,
)
.filter(([value]) => value in this)
.map(([key, value]) => [value, this[key as keyof typeof this]]),
.filter((key) => key in this)
.map((key) => [key, this[key as keyof typeof this]]),
)
}

Expand All @@ -110,6 +105,26 @@ export default abstract class<T extends keyof typeof DeviceType>
) as Omit<UpdateDeviceData[T], 'EffectiveFlags'>
}

get #setDataMapping(): Record<
NonFlagsKeyOf<UpdateDeviceData[T]>,
keyof Values[T]
> {
return this.constructor[Symbol.metadata]?.[setDataSymbol] as Record<
NonFlagsKeyOf<UpdateDeviceData[T]>,
keyof Values[T]
>
}

get #valueMapping(): Record<
keyof Values[T],
NonFlagsKeyOf<UpdateDeviceData[T]>
> {
return this.constructor[Symbol.metadata]?.[keySymbol] as Record<
keyof Values[T],
NonFlagsKeyOf<UpdateDeviceData[T]>
>
}

public async fetch(): Promise<ListDevice[T]['Device']> {
await this.api.fetch()
return this.data
Expand Down
4 changes: 2 additions & 2 deletions src/facades/device_ata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export default class extends BaseDeviceFacade<'Ata'> {
@mapTo('FanSpeed')
public accessor fan: unknown = FanSpeed.auto

@mapTo('VaneHorizontal')
@mapTo('VaneHorizontalDirection')
public accessor horizontal: unknown = Horizontal.auto

@mapTo('OperationMode')
Expand All @@ -20,6 +20,6 @@ export default class extends BaseDeviceFacade<'Ata'> {
@mapTo('SetTemperature')
public accessor temperature: unknown = NUMBER_0

@mapTo('VaneVertical')
@mapTo('VaneVerticalDirection')
public accessor vertical: unknown = Vertical.auto
}
4 changes: 4 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,4 +134,8 @@ export {
flagsAta,
flagsAtw,
flagsErv,
keys,
keysAta,
keysAtw,
keysErv,
} from './types'
9 changes: 9 additions & 0 deletions src/types/ata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,12 @@ export interface ValuesAta extends BaseValues {
readonly temperature?: number
readonly vertical?: Vertical
}

export const keysAta = [
'fan',
'horizontal',
'mode',
'power',
'temperature',
'vertical',
] as const satisfies (keyof ValuesAta)[]
14 changes: 14 additions & 0 deletions src/types/atw.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,3 +131,17 @@ export interface ValuesAtw extends BaseValues {
readonly temperature?: number
readonly temperatureZone2?: number
}

export const keysAtw = [
'coolFlowTemperature',
'coolFlowTemperatureZone2',
'forcedHotWater',
'heatFlowTemperature',
'heatFlowTemperatureZone2',
'hotWaterTemperature',
'mode',
'modeZone2',
'power',
'temperature',
'temperatureZone2',
] as const satisfies (keyof ValuesAtw)[]
9 changes: 9 additions & 0 deletions src/types/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {
type ValuesAta,
type Vertical,
flagsAta,
keysAta,
} from './ata'
import {
type EnergyDataAtw,
Expand All @@ -21,6 +22,7 @@ import {
type UpdateDeviceDataAtw,
type ValuesAtw,
flagsAtw,
keysAtw,
} from './atw'
import {
type GetDeviceDataErv,
Expand All @@ -30,6 +32,7 @@ import {
type UpdateDeviceDataErv,
type ValuesErv,
flagsErv,
keysErv,
} from './erv'

export enum Language {
Expand Down Expand Up @@ -334,3 +337,9 @@ export interface Values {
readonly Atw: ValuesAtw
readonly Erv: ValuesErv
}

export const keys = {
Ata: keysAta,
Atw: keysAtw,
Erv: keysErv,
} as const
6 changes: 6 additions & 0 deletions src/types/erv.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,9 @@ export interface ValuesErv extends BaseValues {
readonly fan?: Exclude<FanSpeed, FanSpeed.silent>
readonly mode?: VentilationMode
}

export const keysErv = [
'fan',
'mode',
'power',
] as const satisfies (keyof ValuesErv)[]
4 changes: 4 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ export {
OperationMode,
Vertical,
flagsAta,
keysAta,
} from './ata'
export {
type AreaData,
Expand Down Expand Up @@ -72,6 +73,7 @@ export {
type WifiPostData,
Language,
flags,
keys,
} from './common'
export {
type EnergyDataAtw,
Expand All @@ -84,6 +86,7 @@ export {
OperationModeState,
OperationModeZone,
flagsAtw,
keysAtw,
} from './atw'
export {
type GetDeviceDataErv,
Expand All @@ -94,4 +97,5 @@ export {
type ValuesErv,
VentilationMode,
flagsErv,
keysErv,
} from './erv'

0 comments on commit dc9db45

Please sign in to comment.