|
|
|
using System.IO.Abstractions;
|
|
|
|
using Recyclarr.Cli.Console.Settings;
|
|
|
|
using Recyclarr.Common.Extensions;
|
|
|
|
using Recyclarr.Platform;
|
|
|
|
using Recyclarr.TrashGuide;
|
|
|
|
|
|
|
|
namespace Recyclarr.Cli.Processors.Config;
|
|
|
|
|
|
|
|
public class TemplateConfigCreator : IConfigCreator
|
|
|
|
{
|
|
|
|
private readonly ILogger _log;
|
|
|
|
private readonly IConfigTemplateGuideService _templates;
|
|
|
|
|
|
|
|
private readonly IAppPaths _paths;
|
|
|
|
|
|
|
|
public TemplateConfigCreator(
|
|
|
|
ILogger log,
|
|
|
|
IConfigTemplateGuideService templates,
|
|
|
|
IAppPaths paths)
|
|
|
|
{
|
|
|
|
_log = log;
|
|
|
|
_templates = templates;
|
|
|
|
_paths = paths;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool CanHandle(ICreateConfigSettings settings)
|
|
|
|
{
|
|
|
|
return settings.Templates.Any();
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Create(ICreateConfigSettings settings)
|
|
|
|
{
|
|
|
|
_log.Debug("Creating config from templates: {Templates}", settings.Templates);
|
|
|
|
|
|
|
|
var matchingTemplateData = _templates.GetTemplateData()
|
|
|
|
.IntersectBy(settings.Templates, path => path.Id, StringComparer.CurrentCultureIgnoreCase)
|
|
|
|
.Select(x => x.TemplateFile);
|
|
|
|
|
|
|
|
foreach (var templateFile in matchingTemplateData)
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
CopyTemplate(templateFile, settings);
|
|
|
|
}
|
|
|
|
catch (FileExistsException e)
|
|
|
|
{
|
|
|
|
_log.Error("Template configuration file could not be saved: {Reason}", e.AttemptedPath);
|
|
|
|
}
|
|
|
|
catch (FileLoadException)
|
|
|
|
{
|
|
|
|
// Do not log here since the origin of this exception is ConfigParser.Load(), which already has
|
|
|
|
// sufficient logging.
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
_log.Error(e, "Unable to save configuration template file");
|
|
|
|
throw;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void CopyTemplate(IFileInfo templateFile, ICreateConfigSettings settings)
|
|
|
|
{
|
|
|
|
var destinationFile = _paths.ConfigsDirectory.File(templateFile.Name);
|
|
|
|
|
|
|
|
if (destinationFile.Exists && !settings.Force)
|
|
|
|
{
|
|
|
|
throw new FileExistsException($"{destinationFile} already exists");
|
|
|
|
}
|
|
|
|
|
|
|
|
destinationFile.CreateParentDirectory();
|
|
|
|
templateFile.CopyTo(destinationFile.FullName, true);
|
|
|
|
|
|
|
|
// ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
|
|
|
|
if (destinationFile.Exists)
|
|
|
|
{
|
|
|
|
_log.Information("Replacing existing file: {Path}", destinationFile);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_log.Information("Created configuration file: {Path}", destinationFile);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|