powerbox icon indicating copy to clipboard operation
powerbox copied to clipboard

Classes and data types

Open agowa opened this issue 4 years ago • 6 comments

Please add data types for simpler handling and error checking. Having types like below will allow:

  • PowerShell to perform syntax checks and show useful error messages
  • Allow to do type validation
  • Provide self documenting code
  • Better interoperability between the New, Get and Set functions
  • Better error handling by strictly typing variables.
<#
class NetboxVirtualMachineCustomFields {
    [ValidateNotNull()][String]$customField000 = ''
    [ValidateNotNull()][String]$customField001 = ''
}
class NetboxTenantCustomFields {
    [ValidateNotNull()][String]$tenant_customField000
}
class NetboxVirtualMachineObject {
    [ValidateNotNullOrEmpty()][String]$name
    [ValidateNotNull()][Int64]$device_role = $nbDeviceRole.Id
    [ValidateNotNullOrEmpty()][Int64]$cluster
    [ValidateNotNull()][ValidateSet('active')][String]$status = 'active'
    [ValidateNotNull()][Int64]$tenant
    [ValidateNotNull()][Int64]$platform = $nbPlatform.Id
    [ValidateNotNull()][Int64]$vcpus = 0
    [ValidateNotNull()][Int64]$memory = 0
    [ValidateNotNull()][Int64]$disk = 0
    [ValidateNotNull()][String]$comment = ''
    [ValidateNotNull()][String[]]$tags = [String[]]@('')
    [ValidateNotNullOrEmpty()][NetboxVirtualMachineCustomFields]$custom_fields
}
class NetboxClusterObject {
    [ValidateNotNull()][String]$name
    [ValidateNotNull()][Int64]$type = $nbClusterType.id
}
class NetboxTenantObject {
    [ValidateNotNull()][String]$name
    [ValidateNotNull()][String]$slug
    [ValidateNotNull()][Int64]$group
    [ValidateNotNull()][NetboxTenantCustomFields]$custom_fields
}
#>

My example is currently static, but it could be generated dynamically too. Just overwriting the new method and calling Add-Member before returning the instantiated object.

agowa avatar Aug 13 '20 17:08 agowa

Hello. I am currently working on this for basically the reasons you mentioned, plus type backing would help bring the objects into compliance with the backend API while also making them more human readable. Hoping to have this in the next release.

BatmanAMA avatar Aug 13 '20 18:08 BatmanAMA

Is it possible to follow the progress? I am new to .net and Powershell classes.

evilensky avatar Aug 20 '20 16:08 evilensky

https://github.com/BatmanAMA/powerbox/tree/update-2.4.x

agowa avatar Aug 20 '20 21:08 agowa

Sorry - I have something I'm cooking up on my local computer. Trying a few different existant modules that will generate stuff from the API spec to see if any of them are reasonable. I have been keeping that in a private repo because anything that touches this repo triggers a beta release and a lot of this literally doesn't run.

BatmanAMA avatar Aug 21 '20 17:08 BatmanAMA

@BatmanAMA Google sent me down to AutoRest Is that something you are currently using? After typing out a few classes by hand using @agowa338 's example and About_Classes, it makes sense that there has to be "a better way."

evilensky avatar Aug 21 '20 17:08 evilensky

I have played with it, and it may be how I generate classes but I don't care for the module part of what it generates.

BatmanAMA avatar Aug 21 '20 17:08 BatmanAMA