1
0
mirror of https://github.com/chylex/Backup-Essentials.git synced 2025-06-03 18:34:06 +02:00
Backup-Essentials/BackupEssentials/Backup/BackupReport.cs

82 lines
2.7 KiB
C#

using BackupEssentials.Backup.IO;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace BackupEssentials.Backup{
public class BackupReport{
private readonly string _plain;
private string _parsed;
public string Report {
get {
if (_parsed == null){
StringBuilder build = new StringBuilder(16+(int)Math.Floor(_plain.Length*1.5D));
foreach(string line in SplitByLine(_plain)){
if (line.Length == 0)continue;
if (line[0] == 'I')build.Append(line.Substring(1)).Append(Environment.NewLine);
else if (line[0] == 'A' && line.Length > 3)build.Append(GetFullNameAction(line[1])).Append(' ').Append(GetFullNameType(line[2])).Append(": ").Append(line.Substring(3)).Append(Environment.NewLine);
}
_parsed = build.ToString();
}
return _parsed;
}
}
private BackupReport(string report){
this._plain = report;
}
public override string ToString(){
return Report;
}
public class Builder{
private StringBuilder Build = new StringBuilder(256);
public void Add(IOAction action, IOType type, string path){
Build.Append('A').Append(GetShortName(action)).Append(GetShortName(type)).Append(path).Append(Environment.NewLine);
}
public void Add(string message){
Build.Append('I').Append(message).Append(Environment.NewLine);
}
public BackupReport Finish(){
return new BackupReport(Build.ToString());
}
}
private static char GetShortName(IOAction action){
return action == IOAction.Create ? 'C' : action == IOAction.Delete ? 'D' : action == IOAction.Replace ? 'R' : '?';
}
private static string GetFullNameAction(char key){
return key == 'C' ? "Added" : key == 'D' ? "Deleted" : key == 'R' ? "Updated" : "(unknown action)";
}
private static char GetShortName(IOType type){
return type == IOType.File ? 'F' : type == IOType.Directory ? 'D' : '?';
}
private static string GetFullNameType(char key){
return key == 'F' ? "File" : key == 'D' ? "Folder (and files inside)" : "(unknown type)";
}
private static IEnumerable<string> SplitByLine(string str){
using(StringReader reader = new StringReader(str)){
string line;
while((line = reader.ReadLine()) != null){
yield return line;
}
}
}
}
}