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!;