/** *** Copyright (c) 2016-2019, Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp. *** Copyright (c) 2020-present, Jaguar0625, gimre, BloodyRookie. *** All rights reserved. *** *** This file is part of Catapult. *** *** Catapult is free software: you can redistribute it and/or modify *** it under the terms of the GNU Lesser General Public License as published by *** the Free Software Foundation, either version 3 of the License, or *** (at your option) any later version. *** *** Catapult is distributed in the hope that it will be useful, *** but WITHOUT ANY WARRANTY; without even the implied warranty of *** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *** GNU Lesser General Public License for more details. *** *** You should have received a copy of the GNU Lesser General Public License *** along with Catapult. If not, see . **/ import { AddressDto } from './AddressDto'; import { GeneratorUtils } from './GeneratorUtils'; import { MosaicIdDto } from './MosaicIdDto'; import { NamespaceAliasTypeDto } from './NamespaceAliasTypeDto'; import { Serializer } from './Serializer'; /** * Binary layout for alias **/ export class NamespaceAliasBuilder implements Serializer { /** Namespace alias type. **/ readonly namespaceAliasType: NamespaceAliasTypeDto; /** Mosaic alias. **/ readonly mosaicAlias?: MosaicIdDto; /** Address alias. **/ readonly addressAlias?: AddressDto; /** * Constructor. * * @param namespaceAliasType Namespace alias type. * @param mosaicAlias Mosaic alias. * @param addressAlias Address alias. */ public constructor( namespaceAliasType: NamespaceAliasTypeDto, mosaicAlias: MosaicIdDto | undefined, addressAlias: AddressDto | undefined, ) { GeneratorUtils.notNull(namespaceAliasType, 'namespaceAliasType is null or undefined'); if (namespaceAliasType === NamespaceAliasTypeDto.MOSAIC_ID) { GeneratorUtils.notNull(mosaicAlias, 'mosaicAlias is null or undefined'); } if (namespaceAliasType === NamespaceAliasTypeDto.ADDRESS) { GeneratorUtils.notNull(addressAlias, 'addressAlias is null or undefined'); } this.namespaceAliasType = namespaceAliasType; this.mosaicAlias = mosaicAlias; this.addressAlias = addressAlias; } /** * Load from binary array - Creates an object from payload. * * @param payload - Byte payload to use to serialize the object. */ public static loadFromBinary(payload: Uint8Array): NamespaceAliasBuilder { const byteArray = Array.from(payload); const namespaceAliasType: NamespaceAliasTypeDto = GeneratorUtils.bufferToUint8(Uint8Array.from(byteArray)); byteArray.splice(0, 1); let mosaicAlias: MosaicIdDto | undefined = undefined; if (namespaceAliasType === NamespaceAliasTypeDto.MOSAIC_ID) { mosaicAlias = MosaicIdDto.loadFromBinary(Uint8Array.from(byteArray)); byteArray.splice(0, mosaicAlias.getSize()); } let addressAlias: AddressDto | undefined = undefined; if (namespaceAliasType === NamespaceAliasTypeDto.ADDRESS) { addressAlias = AddressDto.loadFromBinary(Uint8Array.from(byteArray)); byteArray.splice(0, addressAlias.getSize()); } return new NamespaceAliasBuilder(namespaceAliasType, mosaicAlias, addressAlias); } /** * Creates an instance of NamespaceAliasBuilder. * * @param addressAlias Address alias. * @return Instance of NamespaceAliasBuilder. */ public static createNamespaceAliasBuilderADDRESS(addressAlias: AddressDto): NamespaceAliasBuilder { const namespaceAliasType = NamespaceAliasTypeDto.ADDRESS; return new NamespaceAliasBuilder(namespaceAliasType, undefined, addressAlias); } /** * Creates an instance of NamespaceAliasBuilder. * * @return Instance of NamespaceAliasBuilder. */ public static createNamespaceAliasBuilderNONE(): NamespaceAliasBuilder { const namespaceAliasType = NamespaceAliasTypeDto.NONE; return new NamespaceAliasBuilder(namespaceAliasType, undefined, undefined); } /** * Creates an instance of NamespaceAliasBuilder. * * @param mosaicAlias Mosaic alias. * @return Instance of NamespaceAliasBuilder. */ public static createNamespaceAliasBuilderMOSAIC_ID(mosaicAlias: MosaicIdDto): NamespaceAliasBuilder { const namespaceAliasType = NamespaceAliasTypeDto.MOSAIC_ID; return new NamespaceAliasBuilder(namespaceAliasType, mosaicAlias, undefined); } /** * Gets namespace alias type. * * @return Namespace alias type. */ public getNamespaceAliasType(): NamespaceAliasTypeDto { return this.namespaceAliasType; } /** * Gets mosaic alias. * * @return Mosaic alias. */ public getMosaicAlias(): MosaicIdDto { if (!(this.namespaceAliasType === NamespaceAliasTypeDto.MOSAIC_ID && this.mosaicAlias)) { throw new Error('namespaceAliasType is not set to MOSAIC_ID.'); } return this.mosaicAlias; } /** * Gets address alias. * * @return Address alias. */ public getAddressAlias(): AddressDto { if (!(this.namespaceAliasType === NamespaceAliasTypeDto.ADDRESS && this.addressAlias)) { throw new Error('namespaceAliasType is not set to ADDRESS.'); } return this.addressAlias; } /** * Gets the size of the object. * * @return Size in bytes. */ public getSize(): number { let size = 0; size += 1; // namespaceAliasType if (this.namespaceAliasType === NamespaceAliasTypeDto.MOSAIC_ID) { size += this.mosaicAlias!.getSize(); // mosaicAlias } if (this.namespaceAliasType === NamespaceAliasTypeDto.ADDRESS) { size += this.addressAlias!.getSize(); // addressAlias } return size; } /** * Serializes an object to bytes. * * @return Serialized bytes. */ public serialize(): Uint8Array { let newArray = Uint8Array.from([]); const namespaceAliasTypeBytes = GeneratorUtils.uint8ToBuffer(this.namespaceAliasType); newArray = GeneratorUtils.concatTypedArrays(newArray, namespaceAliasTypeBytes); if (this.namespaceAliasType === NamespaceAliasTypeDto.MOSAIC_ID) { const mosaicAliasBytes = this.mosaicAlias!.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, mosaicAliasBytes); } if (this.namespaceAliasType === NamespaceAliasTypeDto.ADDRESS) { const addressAliasBytes = this.addressAlias!.serialize(); newArray = GeneratorUtils.concatTypedArrays(newArray, addressAliasBytes); } return newArray; } }