import { OperatorFunction, Observable, switchMap, of, map } from "rxjs"; import { HomieDevice } from "./HomieDevice"; import { HomieNode } from "./HomieNode"; import { HomieProperty, OnSetEvent } from "./HomieProperty"; import { HomieID, DeviceAttributes, NodeAttributes, PropertyAttributes, DeviceState, ObjectMap } from "./model"; import { mandatoryPluck } from "./rx"; export function device$(deviceId: HomieID): OperatorFunction, HomieDevice> { return (source: Observable>): Observable => { return source.pipe(mandatoryPluck(deviceId)); } } export function deviceAttrs$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(d => d.attributes$)); } } export function state$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(d => d.state$)); } } export function version$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(d => d.attributes$.pipe(map(attrs => attrs.version)))); } } export function node$(nodeId: HomieID): OperatorFunction | HomieDevice, HomieNode> { return (source: Observable | HomieDevice>): Observable => { return source.pipe( switchMap(v => { if (v instanceof HomieDevice) { return v.nodes$; } else { return of(v); } }), mandatoryPluck(nodeId) ) } } export function nodeAttrs$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(n => n.attributes$)); } } export function property$(propId: HomieID): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(n => n.properties$), mandatoryPluck(propId)); } } export function onSetMessage$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(p => p.onSetMessage$)); } } export function value$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(p => p.value$)); } } export function propAttrs$(): OperatorFunction { return (source: Observable): Observable => { return source.pipe(switchMap(p => p.attributes$)); } }