Innovenergy_trunk/csharp/app/API/DataModel/Path.Extensions.cs

159 lines
5.0 KiB
C#

using static InnovEnergy.API.Result;
namespace InnovEnergy.API.DataModel;
public static class PathExtensions
{
public static Boolean IsRoot(this Path path) => path.Parent is null;
public static Installation? Installation(this Path? path) => path?.Element as Installation;
public static Folder? Folder (this Path? path) => path?.Element as Folder;
public static User? User (this Path? path) => path?.Element as User;
public static UserParent? UserParent (this Path? path) => path?.Element as UserParent;
public static Boolean IsInstallation(this Path? path) => path?.Element is Installation;
public static Boolean IsFolder (this Path? path) => path?.Element is Folder;
public static Boolean IsUser (this Path? path) => path?.Element is User;
public static Boolean Exists(this Path? path) => path?.Element is not null;
public static IEnumerable<Path> Children(this Path? path) => from child in path?.Element.GetChildren()
select new Path(path, child);
public static Result MoveTo(this Path sourcePath, Path targetPath)
{
var add = targetPath.AddChild(sourcePath.Element);
if (add.Succeeded)
{
var delete = sourcePath.Delete();
if (delete.Succeeded)
return Success($"moved {sourcePath} to {targetPath}");
var revert = targetPath.Delete();
if (revert.Failed)
throw new Exception($"failed to move {sourcePath} to {targetPath}");
}
return Failure($"failed to move {sourcePath} to {targetPath}");
}
public static Result Delete(this Path path)
{
var child = path.Element;
var parent = path.Parent?.Element;
if (parent is Folder folder)
{
if (child is Folder f)
{
if (!f.IsEmpty())
return Failure($"Cannot delete folder '{f.Name}'.\nFolder is not empty.");
if (folder.Remove(f))
return Success($"Deleted folder {path}");
}
if (child is User u)
{
if (folder.Remove(u))
return Success($"Deleted user {path}");
}
if (child is Installation i)
{
if (!i.IsEmpty())
return Failure($"Cannot delete installation '{i.Name}'.\nInstallation has active users.");
if (folder.Remove(i))
return Success($"deleted installation {path}");
}
}
else if (parent is Installation installation && child is User user)
{
installation.Remove(user);
return Success($"deleted user {path}");
}
return Failure($"cannot delete {path}");
}
public static Result AddChild(this Path path, DataElement child)
{
var parent = path.Element;
if (parent.GetChildren().Any(c => c.Name == child.Name))
return Failure($"{path} already has an element with name {child.Name}");
if (parent is Folder folder)
{
if (child is Folder f)
{
folder.Add(f);
return Success($"added folder {child.Name} to folder {path}");
}
if (child is User u)
{
folder.Add(u);
return Success($"added user {child.Name} to folder {path}");
}
if (child is Installation i)
{
folder.Add(i);
return Success($"added installation {child.Name} to folder {path}");
}
}
else if (parent is Installation installation && child is User user)
{
installation.Add(user);
return Success($"added user {child.Name} to installation {path}");
}
return Failure($"cannot add {child} to {path}");
}
public static Path? GetDescendant(this Path path, params String[] stringPath)
{
return path.GetDescendant((IEnumerable<String>)stringPath);
}
public static Path? GetDescendant(this Path path, IEnumerable<String> stringPath)
{
foreach (var childName in stringPath)
{
var child = path
.Element
.GetChildren()
.SingleOrDefault(c => c.Name == childName);
if (child is null) return null;
path = new Path(path, child);
}
return path;
}
// public static Path? GetDescendant(this Path path, String stringPath)
// {
// while (!stringPath.IsNullOrWhiteSpace())
// {
// var childName = stringPath.UntilFirst('|');
//
// var child = path
// .Head
// .GetChildren()
// .SingleOrDefault(c => c.Name == childName);
//
// if (child is null) return null;
//
// stringPath = stringPath.AfterFirst('|');
// path = new Path(path, child);
// }
//
// return path;
// }
}