using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using JetBrains.Annotations;
using Stef.Validation;
using WireMock.Exceptions;
using WireMock.Logging;
using WireMock.Server;
using WireMock.Settings;
namespace WireMock.Net.StandAlone;
///
/// The StandAloneApp
///
public static class StandAloneApp
{
private static readonly string Version = typeof(StandAloneApp).GetTypeInfo().Assembly.GetName().Version!.ToString();
///
/// Start WireMock.Net standalone Server based on the WireMockServerSettings.
///
/// The WireMockServerSettings
[PublicAPI]
public static WireMockServer Start(WireMockServerSettings settings)
{
Guard.NotNull(settings, nameof(settings));
var server = WireMockServer.Start(settings);
settings.Logger?.Info("Version [{0}]", Version);
settings.Logger?.Info("Server listening at {0}", string.Join(",", server.Urls));
return server;
}
///
/// Start WireMock.Net standalone Server based on the commandline arguments.
///
/// The commandline arguments
/// The logger
[PublicAPI]
public static WireMockServer Start(string[] args, IWireMockLogger? logger = null)
{
Guard.NotNull(args, nameof(args));
if (TryStart(args, out var server, logger))
{
return server;
}
throw new WireMockException($"Unable start start {nameof(WireMockServer)}.");
}
///
/// Try to start WireMock.Net standalone Server based on the commandline arguments.
///
/// The commandline arguments
/// The logger
/// The WireMockServer
[PublicAPI]
public static bool TryStart(string[] args, [NotNullWhen(true)] out WireMockServer? server, IWireMockLogger? logger = null)
{
Guard.NotNull(args, nameof(args));
if (WireMockServerSettingsParser.TryParseArguments(args, out var settings, logger))
{
settings.Logger?.Info("Version [{0}]", Version);
settings.Logger?.Debug("Server arguments [{0}]", string.Join(", ", args.Select(a => $"'{a}'")));
server = Start(settings);
return true;
}
server = null;
return false;
}
}