XYOracleNetwork/sdk-xyo-client-js

View on GitHub
packages/protocol/packages/boundwitness/packages/wrapper/src/QueryBoundWitnessWrapper.ts

Summary

Maintainability
A
25 mins
Test Coverage
import { assertEx } from '@xylabs/assert'
import { compact } from '@xylabs/lodash'
import { QueryBoundWitness } from '@xyo-network/boundwitness-model'
import { PayloadBuilder } from '@xyo-network/payload'
import { Payload, Query, WithMeta } from '@xyo-network/payload-model'
import { PayloadWrapper } from '@xyo-network/payload-wrapper'

import { BoundWitnessWrapper } from './BoundWitnessWrapper'

export class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {
  private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined
  private _query: T | undefined

  static async parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): Promise<QueryBoundWitnessWrapper<T>> {
    assertEx(!Array.isArray(obj), () => 'Array can not be converted to QueryBoundWitnessWrapper')
    switch (typeof obj) {
      case 'object': {
        const castWrapper = obj as QueryBoundWitnessWrapper<T>
        const wrapper =
          castWrapper instanceof QueryBoundWitnessWrapper ? castWrapper : (
            new QueryBoundWitnessWrapper<T>(
              await PayloadBuilder.build(obj as QueryBoundWitness),
              payloads ? await Promise.all(payloads.map((payload) => PayloadBuilder.build(payload))) : undefined,
            )
          )
        /*if (!wrapper.valid) {
          console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)
        }*/
        return wrapper
      }
    }
    throw new Error(`Unable to parse [${typeof obj}]`)
  }

  async getPayloadsWithoutQuery(): Promise<PayloadWrapper<Payload>[]> {
    this._payloadsWithoutQuery =
      this._payloadsWithoutQuery ??
      (await Promise.all(
        compact((await PayloadBuilder.filterExclude(this.payloads, this.payload.query)).map((payload) => PayloadWrapper.wrap(payload))),
      ))
    return this._payloadsWithoutQuery
  }

  async getQuery(): Promise<T> {
    const payloadMap = await this.payloadsDataHashMap()
    this._query = this._query ?? (payloadMap[this.boundwitness.query] as WithMeta<T> | undefined)
    return assertEx(this._query, () => `Missing Query [${this.boundwitness}]`)
  }
}