develop #7
114
classlib/Cmdlets/BaseCmdlet.cs
Normal file
114
classlib/Cmdlets/BaseCmdlet.cs
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
namespace PS.IPAM.Cmdlets;
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Management.Automation;
|
||||||
|
using PS.IPAM.Helpers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Base class for all PS.IPAM cmdlets providing common functionality.
|
||||||
|
/// </summary>
|
||||||
|
public abstract class BaseCmdlet : PSCmdlet
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Writes the result to the pipeline, handling both single objects and collections.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="result">The result to write to the pipeline.</param>
|
||||||
|
protected void WriteResult(object? result)
|
||||||
|
{
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result is IEnumerable enumerable && result is not string)
|
||||||
|
{
|
||||||
|
foreach (var item in enumerable)
|
||||||
|
{
|
||||||
|
WriteObject(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WriteObject(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts custom fields from various formats to a dictionary.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="customFields">The custom fields object to convert.</param>
|
||||||
|
/// <returns>A dictionary of custom field names and values.</returns>
|
||||||
|
protected static Dictionary<string, object> ConvertCustomFields(object? customFields)
|
||||||
|
{
|
||||||
|
if (customFields == null)
|
||||||
|
{
|
||||||
|
return new Dictionary<string, object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customFields is PSObject psobj)
|
||||||
|
{
|
||||||
|
var dict = new Dictionary<string, object>();
|
||||||
|
foreach (var prop in psobj.Properties)
|
||||||
|
{
|
||||||
|
dict[prop.Name] = prop.Value ?? string.Empty;
|
||||||
|
}
|
||||||
|
return dict;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customFields is Dictionary<string, object> dictObj)
|
||||||
|
{
|
||||||
|
return dictObj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (customFields is IDictionary genericDict)
|
||||||
|
{
|
||||||
|
var result = new Dictionary<string, object>();
|
||||||
|
foreach (DictionaryEntry entry in genericDict)
|
||||||
|
{
|
||||||
|
result[entry.Key?.ToString() ?? string.Empty] = entry.Value ?? string.Empty;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Dictionary<string, object>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes an async operation synchronously and handles errors.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T">The return type of the operation.</typeparam>
|
||||||
|
/// <param name="operation">The async operation to execute.</param>
|
||||||
|
/// <param name="errorId">The error ID for error reporting.</param>
|
||||||
|
/// <returns>The result of the operation, or default if an error occurred.</returns>
|
||||||
|
protected T? ExecuteAsync<T>(Func<System.Threading.Tasks.Task<T>> operation, string errorId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return operation().GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
WriteError(new ErrorRecord(ex, errorId, ErrorCategory.InvalidOperation, null));
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Executes an async operation synchronously and handles errors.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="operation">The async operation to execute.</param>
|
||||||
|
/// <param name="errorId">The error ID for error reporting.</param>
|
||||||
|
protected void ExecuteAsync(Func<System.Threading.Tasks.Task> operation, string errorId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
operation().GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
WriteError(new ErrorRecord(ex, errorId, ErrorCategory.InvalidOperation, null));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
23
classlib/IsExternalInit.cs
Normal file
23
classlib/IsExternalInit.cs
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
// Licensed to the .NET Foundation under one or more agreements.
|
||||||
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
|
|
||||||
|
// This file provides the IsExternalInit type required for using C# 9 records
|
||||||
|
// in projects targeting .NET Standard 2.1 or earlier.
|
||||||
|
|
||||||
|
#if !NET5_0_OR_GREATER
|
||||||
|
|
||||||
|
namespace System.Runtime.CompilerServices
|
||||||
|
{
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reserved to be used by the compiler for tracking metadata.
|
||||||
|
/// This class should not be used by developers in source code.
|
||||||
|
/// </summary>
|
||||||
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
||||||
|
internal static class IsExternalInit
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
22
classlib/enum/SessionStatus.cs
Normal file
22
classlib/enum/SessionStatus.cs
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
namespace PS.IPAM;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the current status of an API session.
|
||||||
|
/// </summary>
|
||||||
|
public enum SessionStatus
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// No session exists or no token is available.
|
||||||
|
/// </summary>
|
||||||
|
NoSession,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The session token has expired.
|
||||||
|
/// </summary>
|
||||||
|
Expired,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The session is valid and ready for use.
|
||||||
|
/// </summary>
|
||||||
|
Valid
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user