Skip to content

Commit

Permalink
add enum utility to handle duplicates but allowing conversion (#10)
Browse files Browse the repository at this point in the history
* add enum utility to handle duplicates but allowing conversion

* fmt and tests
  • Loading branch information
adamhathcock authored Jun 12, 2024
1 parent 628c6b4 commit 4200df0
Show file tree
Hide file tree
Showing 13 changed files with 3,766 additions and 3,511 deletions.
4 changes: 2 additions & 2 deletions Build/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,9 @@ IEnumerable<string> GetFiles(string d)
return Glob.Files(".", d);
}
foreach (var file in GetFiles("**/*.Test.csproj"))
foreach (var file in GetFiles("**/*.Tests.csproj"))
{
Run("dotnet", $"test {file} -c Release --no-restore --verbosity=normal");
Run("dotnet", $"test {file} -c Release --no-build --verbosity=normal");
}
}
);
Expand Down
15 changes: 11 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
<Project>
<ItemGroup>
<PackageVersion Include="Bullseye" Version="5.0.0"/>
<PackageVersion Include="Bullseye" Version="5.0.0" />
<PackageVersion Include="Glob" Version="1.1.9" />
<PackageVersion Include="SimpleExec" Version="12.0.0"/>
<PackageVersion Include="NUnit3TestAdapter" Version="4.5.0" />
<PackageVersion Include="SimpleExec" Version="12.0.0" />
<PackageVersion Include="Speckle.ProxyGenerator" Version="0.1.6" />
<PackageVersion Include="Mapster" Version="7.3.0" />
<PackageVersion Include="MinVer" Version="5.0.0" />
<PackageVersion Include="MinVer" Version="5.0.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="FluentAssertions" Version="6.12.0" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageVersion Include="Moq" Version="4.20.70" />
<PackageVersion Include="NUnit" Version="4.1.0" />
<PackageVersion Include="NUnit.Analyzers" Version="4.2.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
</ItemGroup>
</Project>
</Project>
4 changes: 3 additions & 1 deletion Revit/Speckle.Revit.Api/IRevitDocumentProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ public partial interface IRevitElementProxy : IRevitElement;
public partial class ElementProxy
{
public IRevitParameter GetParameter(RevitBuiltInParameter builtInParameter) =>
new ParameterProxy(_Instance.get_Parameter(Enum<BuiltInParameter>.Parse(builtInParameter.ToString())));
new ParameterProxy(
_Instance.get_Parameter(EnumUtility<RevitBuiltInParameter, BuiltInParameter>.Convert(builtInParameter))
);

public IRevitBoundingBoxXYZ GetBoundingBox() => new BoundingBoxXYZProxy(_Instance.get_BoundingBox(null));

Expand Down
10 changes: 6 additions & 4 deletions Revit/Speckle.Revit.Api/IRevitUnitsProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public partial interface IRevitParameterProxy : IRevitParameter;
public partial class ParameterProxy
{
public bool IsReadOnly => _Instance.IsReadOnly;
public IRevitStorageType StorageType => Enum<IRevitStorageType>.Parse(_Instance.StorageType.ToString());
public IRevitStorageType StorageType => EnumUtility<StorageType, IRevitStorageType>.Convert(_Instance.StorageType);
}

[Proxy(typeof(Definition), ImplementationOptions.UseExtendedInterfaces | ImplementationOptions.ProxyForBaseInterface)]
Expand Down Expand Up @@ -102,7 +102,7 @@ public partial interface IRevitInternalDefinitionProxy : IRevitInternalDefinitio
public partial class InternalDefinitionProxy
{
public RevitBuiltInParameter BuiltInParameter =>
Enum<RevitBuiltInParameter>.Parse(_Instance.BuiltInParameter.ToString());
EnumUtility<BuiltInParameter, RevitBuiltInParameter>.Convert(_Instance.BuiltInParameter);
}

[Proxy(typeof(PolyLine), ImplementationOptions.UseExtendedInterfaces | ImplementationOptions.ProxyForBaseInterface)]
Expand Down Expand Up @@ -197,7 +197,8 @@ public partial interface IRevitFamilyInstanceProxy : IRevitFamilyInstance;

public partial class FamilyInstanceProxy
{
public RevitStructuralType StructuralType => Enum<RevitStructuralType>.Parse(_Instance.StructuralType.ToString());
public RevitStructuralType StructuralType =>
EnumUtility<Autodesk.Revit.DB.Structure.StructuralType, RevitStructuralType>.Convert(_Instance.StructuralType);
}

[Proxy(typeof(Solid), ImplementationOptions.UseExtendedInterfaces | ImplementationOptions.ProxyForBaseInterface)]
Expand All @@ -222,7 +223,8 @@ public partial interface IRevitOptionsProxy : IRevitOptions;

public partial class OptionsProxy
{
public RevitViewDetailLevel DetailLevel => Enum<RevitViewDetailLevel>.Parse(_Instance.DetailLevel.ToString());
public RevitViewDetailLevel DetailLevel =>
EnumUtility<ViewDetailLevel, RevitViewDetailLevel>.Convert(_Instance.DetailLevel);
}

[Proxy(
Expand Down
4 changes: 3 additions & 1 deletion Revit/Speckle.Revit.Api/RevitFilterFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ public IRevitPointCloudFilter CreateMultiPlaneFilter(params IRevitPlane[] planes
);

public IRevitElementCategoryFilter CreateElementCategoryFilter(RevitBuiltInCategory category) =>
new ElementCategoryFilterProxy(new ElementCategoryFilter(Enum<BuiltInCategory>.Parse(category.ToString())));
new ElementCategoryFilterProxy(
new ElementCategoryFilter(EnumUtility<RevitBuiltInCategory, BuiltInCategory>.Convert(category))
);
}

[Proxy(
Expand Down
4 changes: 3 additions & 1 deletion Revit/Speckle.Revit.Api/RevitUnitUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,5 +91,7 @@ public IRevitSolid CreateTransformed(IRevitSolid solid, IRevitTransform inverseT
public class RevitOptionsFactory : IRevitOptionsFactory
{
public IRevitOptions Create(RevitViewDetailLevel viewDetailLevel) =>
new OptionsProxy(new Options() { DetailLevel = Enum<ViewDetailLevel>.Parse(viewDetailLevel.ToString()) });
new OptionsProxy(
new Options() { DetailLevel = EnumUtility<RevitViewDetailLevel, ViewDetailLevel>.Convert(viewDetailLevel) }
);
}
46 changes: 46 additions & 0 deletions Revit/Speckle.Revit.Interfaces/EnumUtility.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using System.Collections.Concurrent;

namespace Speckle.Revit.Interfaces
{
public static class EnumUtility<TSource, TDestination>
where TSource : struct, Enum
where TDestination : struct, Enum
{
private static readonly ConcurrentDictionary<TSource, TDestination> _destinations = new();

static EnumUtility()
{
var sources = ((TSource[])Enum.GetValues(typeof(TSource))).Select(x => (x.ToString().ToUpperInvariant(), x));
var destinations = ((TDestination[])Enum.GetValues(typeof(TDestination)))
.Select(x => (x.ToString().ToUpperInvariant(), x))
.ToList();
foreach (var (name, val) in sources)
{
var d = destinations.Where(x => x.Item1 == name).ToList();
if (d.Any())
{
foreach (var v in d)
{
destinations.Remove(v);
}
}
else
{
throw new InvalidOperationException($"{name} does not exist in destination enum: {typeof(TDestination)}");
}

_destinations.TryAdd(val, d.First().x);
}
}

public static TDestination Convert(TSource source)
{
if (_destinations.TryGetValue(source, out var destination))
{
return destination;
}

throw new InvalidOperationException($"{source} does not exist in destination enum: {typeof(TDestination)}");
}
}
}
Loading

0 comments on commit 4200df0

Please sign in to comment.