Azure/bicep

Support single-line objects/arrays

alex-frankel opened this issue ยท 8 comments

This could be implemented by #498, but the other option is to somehow do this without ,

Please... especially when LoC and verbosity are some of the advantages of Bicep

By single line assume we mean allowing something like

    addressSpace: {
      addressPrefixes: [ '10.0.0.0/16' ]
    }

One comment I'd have is that as you start to think about single line objects, consider what would happen if you have a bicep linter and your linter converts from single-line to multi-line.

With single line, these would be the same in bicep:

    addressSpace: {
      addressPrefixes: [ '10.0.0.0/16', '10.1.0.0/16' ]
    }
...
    addressSpace: {
      addressPrefixes: [ 
        '10.0.0.0/16'
        '10.1.0.0/16'
      ]
    }

However, a simple code formatting tool may have issues converting between the two since there's not just a white space change.
The linting tool would have to know that the comma is needed in single-line, but not needed in multi-line.

Give that changing lines involved more than just white-space, my suggestion is that you either support just a white-space separator or support both white-space and comma.

This would mean that this would be valid syntax:

    addressSpace: {
      addressPrefixes: [ '10.0.0.0/16' '10.1.0.0/16' ]
    }
...
    addressSpace: {
      addressPrefixes: [ 
        '10.0.0.0/16'
        '10.1.0.0/16'
      ]
    }

Along with

    addressSpace: {
      addressPrefixes: [ '10.0.0.0/16', '10.1.0.0/16' ]
    }
...
    addressSpace: {
      addressPrefixes: [ 
        '10.0.0.0/16',
        '10.1.0.0/16'
      ]
    }

Personally, I support the second syntax (commas) because then each object is a (semi) valid JSON primitive. It would be super nice if it was a valid primitive, but that would require supporting real quote characters :-)

An alternative could be simply providing a folding option in VS Code, which also shows the "folded" contents in a csv list.

Here is an example of how PyCharm does this folding docstrings.
image

image

Seems the same applies for the contains() function.

Instead of writing

var supportsBlobService = storageAccountKind == 'BlockBlobStorage' || storageAccountKind == 'BlobStorage' || storageAccountKind == 'StorageV2' || storageAccountKind == 'Storage'

I would rather be able to write:

var supportsBlobService = contains(['BlockBlobStorage', 'BlobStorage', 'StorageV2', 'Storage'], storageAccountKind)

I get around the || with another var and a contains:

param subnetName string

var specialSubnet = [
  'GatewaySubnet'
  'AzureBastionSubnet'
  'AzureFirewallSubnet'
]

var isSpecial = contains(specialSubnet, subnetName )
miqm commented

@anthony-c-martin - we can probably remove this from the limitation list in Readme.md :)

@HenrikSommer-eng, thanks for reminding me - I have raised MicrosoftDocs/azure-docs#95371 for our docs team to pick up.