diff --git a/src/DockerComposeBuilder.Examples.Complex/Program.cs b/src/DockerComposeBuilder.Examples.Complex/Program.cs index 4189c1b..440d62f 100644 --- a/src/DockerComposeBuilder.Examples.Complex/Program.cs +++ b/src/DockerComposeBuilder.Examples.Complex/Program.cs @@ -8,6 +8,9 @@ var dbPass = "pass"; var dbName = "wordpress"; +var certificatesVolume = Builder.MakeVolume("certificates") + .Build(); + var network1 = Builder.MakeNetwork("my-net") .SetExternal(true) .Build(); @@ -66,6 +69,7 @@ .WithServices(mysql, wordpress) .WithNetworks(network1, network2) .WithSecrets(secret1) + .WithVolumes(certificatesVolume) .Build(); // serialize our object graph to yaml for writing to a docker-compose file diff --git a/src/DockerComposeBuilder/Builders/ComposeBuilder.cs b/src/DockerComposeBuilder/Builders/ComposeBuilder.cs index 176f497..d1f8ef1 100644 --- a/src/DockerComposeBuilder/Builders/ComposeBuilder.cs +++ b/src/DockerComposeBuilder/Builders/ComposeBuilder.cs @@ -1,4 +1,5 @@ using DockerComposeBuilder.Builders.Base; +using DockerComposeBuilder.Interfaces; using DockerComposeBuilder.Model; using System; using System.Collections.Generic; @@ -14,100 +15,75 @@ public ComposeBuilder WithVersion(string version) } /// - /// Add services to the Compose object + /// Add services to the Compose object /// /// /// - public ComposeBuilder WithServices(params Service[] services) - { - if (WorkingObject.Services == null) - { - WorkingObject.Services = new Dictionary(); - } - - foreach (var service in services) - { - if (WorkingObject.Services.ContainsKey(service.Name)) - { - throw new Exception("Service name already added to services, please pick a unique one!"); - } - - WorkingObject.Services.Add(service.Name, service); - } - - return this; - } + public ComposeBuilder WithServices(params Service[] services) => WithT( + () => WorkingObject.Services, + x => WorkingObject.Services = x, + services + ); /// - /// Add networks to the compose object + /// Add networks to the compose object /// /// /// - public ComposeBuilder WithNetworks(params Network[] networks) - { - if (WorkingObject.Networks == null) - { - WorkingObject.Networks = new Dictionary(); - } - - foreach (var network in networks) - { - if (WorkingObject.Networks.ContainsKey(network.Name)) - { - throw new Exception("Network name already added to networks, please pick a unique one!"); - } - - WorkingObject.Networks.Add(network.Name, network); - } - - return this; - } + public ComposeBuilder WithNetworks(params Network[] networks) => WithT( + () => WorkingObject.Networks, + x => WorkingObject.Networks = x, + networks + ); /// - /// Add volumes to the compose object + /// Add volumes to the compose object /// /// /// - public ComposeBuilder WithVolumes(params Volume[] volumes) - { - if (WorkingObject.Networks == null) - { - WorkingObject.Volumes = new Dictionary(); - } - - foreach (var volume in volumes) - { - if (WorkingObject.Volumes!.ContainsKey(volume.Name)) - { - throw new Exception("Volume name already added to volumes, please pick a unique one!"); - } - - WorkingObject.Volumes.Add(volume.Name, volume); - } - - return this; - } + public ComposeBuilder WithVolumes(params Volume[] volumes) => WithT( + () => WorkingObject.Volumes, + x => WorkingObject.Volumes = x, + volumes + ); /// - /// Add secrets to the compose object + /// Add secrets to the compose object /// /// /// - public ComposeBuilder WithSecrets(params Secret[] secrets) + public ComposeBuilder WithSecrets(params Secret[] secrets) => WithT( + () => WorkingObject.Secrets, + x => WorkingObject.Secrets = x, + secrets + ); + + /// + /// Add services to the Compose object + /// + /// + private ComposeBuilder WithT( + Func?> getCollection, + Action> setCollection, + params T[] parameters + ) where T : IObject { - if (WorkingObject.Secrets == null) + var collection = getCollection(); + + if (collection == null) { - WorkingObject.Secrets = new Dictionary(); + collection = new Dictionary(); + setCollection(collection); } - foreach (var secret in secrets) + foreach (var parameter in parameters) { - if (WorkingObject.Secrets.ContainsKey(secret.Name)) + if (collection.ContainsKey(parameter.Name)) { - throw new Exception("Secret name already added to secrets, please pick a unique one!"); + throw new Exception($"{typeof(T).Name} name ('{parameter.Name}') already added to the target collection, please pick a unique one!"); } - WorkingObject.Secrets.Add(secret.Name, secret); + collection.Add(parameter.Name, parameter); } return this; diff --git a/src/DockerComposeBuilder/Model/Compose.cs b/src/DockerComposeBuilder/Model/Compose.cs index 391d1d0..c56e95d 100644 --- a/src/DockerComposeBuilder/Model/Compose.cs +++ b/src/DockerComposeBuilder/Model/Compose.cs @@ -11,14 +11,14 @@ public class Compose public string? Version { get; set; } [YamlMember(Alias = "services")] - public Dictionary? Services { get; set; } + public IDictionary? Services { get; set; } [YamlMember(Alias = "networks")] - public Dictionary? Networks { get; set; } + public IDictionary? Networks { get; set; } [YamlMember(Alias = "secrets")] - public Dictionary? Secrets { get; set; } + public IDictionary? Secrets { get; set; } [YamlMember(Alias = "volumes")] - public Dictionary? Volumes { get; set; } + public IDictionary? Volumes { get; set; } } diff --git a/src/DockerComposeBuilder/Model/Service.cs b/src/DockerComposeBuilder/Model/Service.cs index 978f1d0..2a2cc67 100644 --- a/src/DockerComposeBuilder/Model/Service.cs +++ b/src/DockerComposeBuilder/Model/Service.cs @@ -1,4 +1,5 @@ using DockerComposeBuilder.Enums; +using DockerComposeBuilder.Interfaces; using DockerComposeBuilder.Model.Services; using System; using System.Collections.Generic; @@ -7,7 +8,7 @@ namespace DockerComposeBuilder.Model; [Serializable] -public class Service +public class Service : IObject { [YamlIgnore] public string Name { get; set; } = null!;