generated/runtime/BuildTime/Cmdlets/ExportFormatPs1xml.cs

/*---------------------------------------------------------------------------------------------
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management.Automation;
using System.Reflection;

namespace Commvault.Powershell.Runtime.PowerShell
{
  [Cmdlet(VerbsData.Export, "FormatPs1xml")]
  [DoNotExport]
  public class ExportFormatPs1xml : PSCmdlet
  {
    [Parameter(Mandatory = true)]
    [ValidateNotNullOrEmpty]
    public string FilePath { get; set; }

    private const string ModelNamespace = @"Commvault.Powershell.Models";
    private const string SupportNamespace = @"Commvault.Powershell.Support";
    private static readonly bool IsAzure = Convert.ToBoolean(@"false");

    protected override void ProcessRecord()
    {
      try
      {
        var viewModels = GetFilteredViewParameters().Select(CreateViewModel).ToList();
        var ps1xml = new Configuration
        {
          ViewDefinitions = new ViewDefinitions
          {
            Views = viewModels
          }
        };
        File.WriteAllText(FilePath, ps1xml.ToXmlString());
      }
      catch (Exception ee)
      {
        Console.WriteLine($"${ee.GetType().Name}/{ee.StackTrace}");
        throw ee;
      }
    }

    private static IEnumerable<ViewParameters> GetFilteredViewParameters()
    {
      //https://stackoverflow.com/a/79738/294804
      //https://stackoverflow.com/a/949285/294804
      var types = Assembly.GetExecutingAssembly().GetExportedTypes()
          .Where(t => t.IsClass
                      && (t.Namespace.StartsWith(ModelNamespace) || t.Namespace.StartsWith(SupportNamespace))
                      && !t.GetCustomAttributes<DoNotFormatAttribute>().Any());
      return types.Select(t => new ViewParameters(t, t.GetProperties()
          .Select(p => new PropertyFormat(p))
          .Where(pf => !pf.Property.GetCustomAttributes<DoNotFormatAttribute>().Any()
                       && (!IsAzure || pf.Property.Name != "Id")
                       && (pf.FormatTable != null || (pf.Origin != PropertyOrigin.Inlined && pf.Property.PropertyType.IsPsSimple())))
          .OrderByDescending(pf => pf.Index.HasValue)
          .ThenBy(pf => pf.Index)
          .ThenByDescending(pf => pf.Origin.HasValue)
          .ThenBy(pf => pf.Origin))).Where(vp => vp.Properties.Any());
    }

    private static View CreateViewModel(ViewParameters viewParameters)
    {
      var entries = viewParameters.Properties.Select(pf =>
          (TableColumnHeader: new TableColumnHeader { Label = pf.Label, Width = pf.Width },
           TableColumnItem: new TableColumnItem { PropertyName = pf.Property.Name })).ToArray();

      return new View
      {
        Name = viewParameters.Type.FullName,
        ViewSelectedBy = new ViewSelectedBy
        {
          TypeName = viewParameters.Type.FullName
        },
        TableControl = new TableControl
        {
          TableHeaders = new TableHeaders
          {
            TableColumnHeaders = entries.Select(e => e.TableColumnHeader).ToList()
          },
          TableRowEntries = new TableRowEntries
          {
            TableRowEntry = new TableRowEntry
            {
              TableColumnItems = new TableColumnItems
              {
                TableItems = entries.Select(e => e.TableColumnItem).ToList()
              }
            }
          }
        }
      };
    }
  }
}