CommandError for Copy

This commit is contained in:
2025-01-11 07:45:26 +01:00
parent 07bb6746d6
commit b59749478a
4 changed files with 30 additions and 9 deletions

View File

@@ -0,0 +1,3 @@
namespace FileTime.Core.Command;
public record CommandError(string Message, Exception? Exception);

View File

@@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using DeclarativeProperty;
using FileTime.Core.Timeline;
@@ -9,6 +10,7 @@ public interface ICommand
IDeclarativeProperty<string> DisplayDetailLabel { get; }
IDeclarativeProperty<int> TotalProgress { get; }
IDeclarativeProperty<int> CurrentProgress { get; }
IDeclarativeProperty<ObservableCollection<CommandError>> Errors { get; }
Task<CanCommandRun> CanRun(PointInTime currentTime);
Task<PointInTime> SimulateCommand(PointInTime currentTime);

View File

@@ -1,3 +1,4 @@
using System.Collections.ObjectModel;
using DeclarativeProperty;
using FileTime.Core.Timeline;
@@ -9,11 +10,14 @@ public abstract class CommandBase : ICommand
private readonly DeclarativeProperty<string> _displayDetailLabel;
private readonly DeclarativeProperty<int> _totalProgress;
private readonly DeclarativeProperty<int> _currentProgress;
private readonly DeclarativeProperty<ObservableCollection<CommandError>> _errorsProperty;
private readonly ObservableCollection<CommandError> _errors = [];
public IDeclarativeProperty<string> DisplayLabel { get; }
public IDeclarativeProperty<string> DisplayDetailLabel { get; }
public IDeclarativeProperty<int> TotalProgress { get; }
public IDeclarativeProperty<int> CurrentProgress { get; }
public IDeclarativeProperty<ObservableCollection<CommandError>> Errors { get; }
protected CommandBase(string displayLabel = "", string displayDetailLabel = "", int totalProgress = 0, int currentProgress = 0)
{
@@ -21,11 +25,13 @@ public abstract class CommandBase : ICommand
_displayDetailLabel = new(displayDetailLabel);
_totalProgress = new(totalProgress);
_currentProgress = new(currentProgress);
_errorsProperty = new(_errors);
DisplayLabel = _displayLabel;
DisplayDetailLabel = _displayDetailLabel;
TotalProgress = _totalProgress;
CurrentProgress = _currentProgress;
Errors = _errorsProperty;
}
public abstract Task<CanCommandRun> CanRun(PointInTime currentTime);
@@ -50,4 +56,6 @@ public abstract class CommandBase : ICommand
return Task.FromResult((int)(dataList.Sum(d => d.Progress) * 100 / total));
})
.Subscribe(async (p, _) => await SetTotalProgress(p));
protected void AddError(CommandError error) => _errors.Add(error);
}

View File

@@ -52,7 +52,7 @@ public class CopyCommand : CommandBase, ITransportationCommand
return p?.Progress.Map(currentProgress =>
p.TotalCount == 0
? 0
: (int) (currentProgress * 100 / p.TotalCount)
: (int)(currentProgress * 100 / p.TotalCount)
);
})
.Switch()
@@ -174,7 +174,7 @@ public class CopyCommand : CommandBase, ITransportationCommand
{
if (_cancellationTokenSource.IsCancellationRequested) return;
var resolvedTarget = (IContainer) await target.ResolveAsync() ?? throw new Exception();
var resolvedTarget = (IContainer)await target.ResolveAsync() ?? throw new Exception();
var item = await _timelessContentProvider.GetItemByFullNameAsync(source, currentTime);
if (item is IContainer container)
@@ -183,7 +183,7 @@ public class CopyCommand : CommandBase, ITransportationCommand
{
await container.WaitForLoaded(_cancellationTokenSource.Token);
}
catch(OperationCanceledException)
catch (OperationCanceledException)
{
return;
}
@@ -208,8 +208,16 @@ public class CopyCommand : CommandBase, ITransportationCommand
var currentProgress = _operationProgresses.Find(o => o.Key == element.FullName!.Path);
await _currentOperationProgress.SetValue(currentProgress);
try
{
await copyOperation.CopyAsync(new AbsolutePath(_timelessContentProvider, element), newElementPath, new CopyCommandContext(UpdateProgress, currentProgress, _cancellationTokenSource.Token));
}
catch (Exception e)
{
_logger.LogError("Error while copying file: {Path}, {Message}", element.FullName!.Path, e.Message);
AddError(new CommandError("Error while copying file: " + element.FullName!.Path, e));
}
}
}
}