All files / src/impl ContractsFactory.impl.ts

100% Statements 37/37
100% Branches 2/2
100% Functions 7/7
100% Lines 36/36

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 8525x     25x   25x   25x 25x 25x 25x   25x 25x 25x 25x 25x 25x 25x 25x 25x             25x 165x                 25x 164x                           165x 165x 165x   165x       165x       165x 165x   165x 165x 165x 165x 165x 165x 165x   165x             165x    
import { CONTRACT as AUTO_CLOSE_FACTORY } from "@jonloucks/contracts-ts/api/AutoCloseFactory";
import { Contracts, Config as ContractsConfig } from "@jonloucks/contracts-ts/api/Contracts";
import { ContractsFactory } from "@jonloucks/contracts-ts/api/ContractsFactory";
import { CONTRACT as PROMISOR_FACTORY } from "@jonloucks/contracts-ts/api/PromisorFactory";
import { Repository } from "@jonloucks/contracts-ts/api/Repository";
import { CONTRACT as REPOSITORY_FACTORY, RepositoryFactory } from "@jonloucks/contracts-ts/api/RepositoryFactory";
import { RequiredType } from "@jonloucks/contracts-ts/api/Types";
import { CONTRACT as ATOMIC_BOOLEAN_FACTORY } from "@jonloucks/contracts-ts/auxiliary/AtomicBooleanFactory";
import { CONTRACT as ATOMIC_INTEGER_FACTORY } from "@jonloucks/contracts-ts/auxiliary/AtomicIntegerFactory";
import { CONTRACT as ATOMIC_REFERENCE_FACTORY } from "@jonloucks/contracts-ts/auxiliary/AtomicReferenceFactory";
import { CONTRACT as IDEMPOTENT_FACTORY } from "@jonloucks/contracts-ts/auxiliary/IdempotentFactory";
 
import { create as createAtomicBooleanFactoryImpl } from "./AtomicBooleanFactory.impl";
import { create as createAtomicIntegerFactoryImpl } from "./AtomicIntegerFactory.impl";
import { create as createAtomicReferenceFactoryImpl } from "./AtomicReferenceFactory.impl";
import { create as createAutoCloseFactoryImpl } from "./AutoCloseFactory.impl";
import { create as createContractsImpl } from "./Contracts.impl";
import { wrap as wrapContracts } from "./ContractsWrapper.impl";
import { create as createPromisorFactoryImpl } from "./PromisorFactory.impl";
import { create as createRepositoryFactoryImpl } from "./RepositoryFactory.impl";
import { create as createIdempotentFactoryImpl } from "./IdempotentFactory.impl";
 
/**
 * Factory method to create a ContractsFactory
 * 
 * @returns the ContractsFactory implementation
 */
export function create(): RequiredType<ContractsFactory> {
  return ContractsFactoryImpl.internalCreate();
}
 
/**
 * Factory method to create Contracts instance.
 * 
 * @param config the configuration for the Contracts instance
 * @returns the Contracts implementation
 */
export function createContracts(config?: ContractsConfig): RequiredType<Contracts> {
  return create().createContracts(config);
}
 
// ---- Implementation details below ----
 
/**
 * Implementation for ContractsFactory
 */
class ContractsFactoryImpl implements ContractsFactory {
 
  /**
   * ContractsFactory.createContracts override
   */
  createContracts(config?: ContractsConfig): RequiredType<Contracts> {
    const actualConfig: RequiredType<ContractsConfig> = config ?? this.#defaultConfig;
    const contracts: RequiredType<Contracts> = createContractsImpl(actualConfig);
    const repository: RequiredType<Repository> = this.createKernelRepository(contracts);
 
    return wrapContracts(contracts, repository);
  }
 
  static internalCreate(): RequiredType<ContractsFactory> {
    return new ContractsFactoryImpl();
  }
 
  private createKernelRepository(contracts: Contracts): RequiredType<Repository> {
    const repositoryFactory: RequiredType<RepositoryFactory> = createRepositoryFactoryImpl(contracts);
    const repository: RequiredType<Repository> = repositoryFactory.createRepository();
 
    repository.keep(IDEMPOTENT_FACTORY, createIdempotentFactoryImpl);
    repository.keep(PROMISOR_FACTORY, createPromisorFactoryImpl);
    repository.keep(REPOSITORY_FACTORY, () => repositoryFactory);
    repository.keep(ATOMIC_BOOLEAN_FACTORY, createAtomicBooleanFactoryImpl);
    repository.keep(ATOMIC_INTEGER_FACTORY, createAtomicIntegerFactoryImpl);
    repository.keep(ATOMIC_REFERENCE_FACTORY, createAtomicReferenceFactoryImpl);
    repository.keep(AUTO_CLOSE_FACTORY, createAutoCloseFactoryImpl);
 
    return repository;
  }
 
  private constructor() {
    //  empty
  }
 
  #defaultConfig: RequiredType<ContractsConfig> = {};
}