From f66e46850f68461854c1c7532b34fa637617bff7 Mon Sep 17 00:00:00 2001 From: Hamcha Date: Sun, 7 Apr 2024 20:32:00 +0200 Subject: [PATCH] feat: more stuff --- src/components/network.ts | 12 +++++++++++ src/components/service.ts | 9 +++++++- src/components/stack.ts | 43 +++++++++++++++++++++++++++++++++------ src/components/volume.ts | 12 +++++++++++ 4 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 src/components/network.ts create mode 100644 src/components/volume.ts diff --git a/src/components/network.ts b/src/components/network.ts new file mode 100644 index 0000000..dc63622 --- /dev/null +++ b/src/components/network.ts @@ -0,0 +1,12 @@ +import { DefinitionsNetwork } from "../compose-schema"; + +export class Network { + constructor( + public readonly name: string, + private options: DefinitionsNetwork + ) {} + + toCompose(): DefinitionsNetwork { + return this.options; + } +} diff --git a/src/components/service.ts b/src/components/service.ts index 7ddbab5..572778a 100644 --- a/src/components/service.ts +++ b/src/components/service.ts @@ -1,5 +1,12 @@ import { DefinitionsService } from "../compose-schema.ts"; export class Service { - constructor(public name: string, public options: DefinitionsService) {} + constructor( + public readonly name: string, + private options: DefinitionsService + ) {} + + toCompose(): DefinitionsService { + return this.options; + } } diff --git a/src/components/stack.ts b/src/components/stack.ts index 7d81433..85263db 100644 --- a/src/components/stack.ts +++ b/src/components/stack.ts @@ -1,9 +1,26 @@ -import { ComposeSpecification, DefinitionsService } from "../compose-schema.ts"; +import { + ComposeSpecification, + DefinitionsNetwork, + DefinitionsService, + DefinitionsVolume, +} from "../compose-schema.ts"; import { registerDeployment } from "../deployment.ts"; +import { Network } from "./network.ts"; import { Service } from "./service.ts"; +import { Volume } from "./volume.ts"; + +function mapRecordToCompose( + obj: Record +): Record { + return Object.fromEntries( + Object.entries(obj).map(([k, v]) => [k, v.toCompose()]) + ); +} export class Stack { private services: Record = {}; + private networks: Record = {}; + private volumes: Record = {}; constructor(public name: string) { registerDeployment(this); @@ -18,14 +35,28 @@ export class Stack { return this.services[name]; } - public toComposeFile(): ComposeSpecification { - const services: Record = {}; - for (const [name, service] of Object.entries(this.services)) { - services[name] = service.options; + public addNetwork(name: string, network: DefinitionsNetwork): Network { + if (this.networks[name]) { + throw new Error(`Network ${name} already defined.`); } + this.networks[name] = new Network(name, network); + return this.networks[name]; + } + + public addVolume(name: string, volume: DefinitionsVolume): Volume { + if (this.volumes[name]) { + throw new Error(`Volume ${name} already defined.`); + } + this.volumes[name] = new Volume(name, volume); + return this.volumes[name]; + } + + public toComposeFile(): ComposeSpecification { return { version: "3.8", - services, + services: mapRecordToCompose(this.services), + networks: mapRecordToCompose(this.networks), + volumes: mapRecordToCompose(this.volumes), }; } } diff --git a/src/components/volume.ts b/src/components/volume.ts new file mode 100644 index 0000000..fc2d14c --- /dev/null +++ b/src/components/volume.ts @@ -0,0 +1,12 @@ +import { DefinitionsVolume } from "../compose-schema"; + +export class Volume { + constructor( + public readonly name: string, + private options: DefinitionsVolume + ) {} + + toCompose(): DefinitionsVolume { + return this.options; + } +}