Skip to content

Instantly share code, notes, and snippets.

@pjmagee
Created May 19, 2024 15:11
Show Gist options
  • Save pjmagee/0acc8be873b013d9882e6c6e109e263e to your computer and use it in GitHub Desktop.
Save pjmagee/0acc8be873b013d9882e6c6e109e263e to your computer and use it in GitHub Desktop.
<#
.SYNOPSIS
Generates code using the Kiota generator in the specified languages for defined OpenAPI specs.
.DESCRIPTION
This script generates code using the Kiota generator in the specified languages for defined OpenAPI specs.
Each subfolder in the examples folder is named after the language and the output is placed in a subfolder named after the namespace.
The generated code is then expanded to include additional functionality.
The additional functionality includes:
- Authentication and token management
- Logging
- Error handling
- Kiota client configuration
- Consumption of the endpoints defined in the OpenAPI specs and the handling of the responses and cursor pagination
.PARAMETER csharp
Generate C# code.
.PARAMETER go
Generate Go code.
.PARAMETER java
Generate Java code.
.PARAMETER python
Generate Python code.
.PARAMETER all
Generate code for all languages.
.EXAMPLE
.\Use-Kiota-Generator.ps1 -csharp
.NOTES
Any additional notes about the script.
#>
param(
[Parameter(Mandatory = $false)]
[switch] $csharp,
[Parameter(Mandatory = $false)]
[switch] $go,
[Parameter(Mandatory = $false)]
[switch] $java,
[Parameter(Mandatory = $false)]
[switch] $python,
[Parameter(Mandatory = $false)]
[switch] $all
)
enum Language {
CSharp
Go
Java
Python
}
## https://learn.microsoft.com/en-us/powershell/scripting/developer/cmdlet/approved-verbs-for-windows-powershell-commands?view=powershell-7.4
class Spec {
[string]$url
[Settings[]]$settings
Spec([string]$url, [Settings[]]$settings) {
$this.url = $url
$this.settings = $settings
}
}
class Settings {
[Language]$language
[string]$namespace
[string]$output
Settings([Language]$language, [string]$namespace, [string]$output) {
$this.language = $language
$this.namespace = $namespace
$this.output = $output
}
}
$specs = @(
[Spec]::new("https://developer.icis.com/portals/api/sites/icis-live-portal/liveportal/apis/energyapi/download_spec",
@(
[Settings]::new([Language]::CSharp, "Icis.Api.Energy", "Energy"),
[Settings]::new([Language]::Go, "icis/api/energy", "energy")
[Settings]::new([Language]::Java, "com.icis.api.energy", "src/main/java/com/icis/api/energy"),
[Settings]::new([Language]::Python, "icis_api_energy", "energy")
)),
[Spec]::new("https://developer.icis.com/portals/api/sites/icis-live-portal/liveportal/apis/energyforesightapi/download_spec",
@(
[Settings]::new([Language]::CSharp, "Icis.Api.EnergyForesight", "EnergyForesight"),
[Settings]::new([Language]::Go, "icis/api/energyforesight", "energyforesight")
[Settings]::new([Language]::Java, "com.icis.api.energyforesight", "src/main/java/com/icis/api/energyforesight"),
[Settings]::new([Language]::Python, "icis_api_energyforesight", "energyforesight")
)),
[Spec]::new("https://developer.icis.com/portals/api/sites/icis-live-portal/liveportal/apis/lnganalyticsapi/download_spec",
@(
[Settings]::new([Language]::CSharp, "Icis.Api.LngAnalytics", "LngAnalytics"),
[Settings]::new([Language]::Go, "icis/api/lnganalytics", "lnganalytics")
[Settings]::new([Language]::Java, "com.icis.api.lnganalytics", "src/main/java/com/icis/api/lnganalytics"),
[Settings]::new([Language]::Python, "icis_api_lnganalytics", "lnganalytics")
))
)
function Use-Kiota-Generator {
param(
[Parameter(Mandatory = $true)]
[Language]
$language
)
$specs | ForEach-Object {
$spec = $_
$spec.settings | Where-Object { $_.language -eq $language } | ForEach-Object {
$lang = $_.language
$namespace = $_.namespace
$output = $_.output
Write-Host "Generating $($lang) for $($spec.url)"
docker run -v ${PWD}/examples:/app/output mcr.microsoft.com/openapi/kiota:1.14.0 generate `
--output /app/output/$lang/$output `
--language $lang `
--namespace-name $namespace `
--openapi $($spec.url) `
--exclude-backward-compatible true `
--log-level Debug `
--clean-output `
--additional-data true `
--class-name ApiClient
}
}
}
try {
$languages = @()
if ($all) {
$languages = [Enum]::GetValues([Language])
}
else {
if ($csharp) { $languages += [Language]::CSharp }
if ($go) { $languages += [Language]::Go }
if ($java) { $languages += [Language]::Java }
if ($python) { $languages += [Language]::Python }
}
$languages | ForEach-Object {
Use-Kiota-Generator -language $_
}
}
catch {
Write-Error $_.Exception.Message
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment