pkl icon indicating copy to clipboard operation
pkl copied to clipboard

[feat] Render to INI-style formats

Open moritztim opened this issue 1 year ago • 8 comments

I know your bandwidth is limited, just putting it out there. I would love to see support for INI-like formats, such as systemd configuration files or even just plain ini files.

Here are the INI-style formats I can think of:

Feel free to suggest more and I'll add them to the list

moritztim avatar Feb 13 '24 12:02 moritztim

It's a totally legit ask. For other output formats, especially "simpler" ones, we recommend implementing them in Pkl itself. We did this with the TOML renderer, for example: https://github.com/apple/pkl-pantry/tree/main/packages/pkl.toml

Since bandwidth is indeed limited, you might want to have a go at it that way yourself; we're more than happy to support / review / etc. and since this can be written in Pkl itself, it doesn't require expertise about Pkl internals.

holzensp avatar Feb 13 '24 14:02 holzensp

Hi, ill have a look at starting to create a INIRenderer.

Madmegsox1 avatar Feb 13 '24 14:02 Madmegsox1

since this can be written in Pkl itself, it doesn't require expertise about Pkl internals.

I love that Unfortunately my bandwith is also limited :skull: but I might get into making some other renderers at a later point, sounds like a fun challenge

moritztim avatar Feb 13 '24 15:02 moritztim

Its looking good so far the IniRenderer renders ini files in the correct structure just need to handle escape codes and correctly formatting (breakline after each nest) the ini file. Here is a look at what the test outputted.

int = 123
float = 1.23
bool = true
string = Pigeon
unicodeString = abc😀abc😎abc
multiLineString = have a
great
day
[map]
one = 123
two = 1.23
three = true
four = Pigeon
five = abc😀abc😎abc
six = have a
great
day
[map.seven]
name = Pigeon
[mapping]
one = 123
two = 1.23
three = true
four = Pigeon
five = abc😀abc😎abc
six = have a
great
day
[mapping.seven]
name = Pigeon
[typedObject]
name = Pigeon
age = 30
[typedObject.address]
street = Folsom St.
[container]
name = Pigeon
age = 30
[container.address]
street = Folsom St.

Madmegsox1 avatar Feb 13 '24 22:02 Madmegsox1

Its now outputting correctly and handles escape chars. Is there anywhere else i need to add the IniRenderer to?

Madmegsox1 avatar Feb 14 '24 01:02 Madmegsox1

Nice! Do you want to PR this? That will make it a little easier to iterate.

To add a new in-language renderer, you will need to create a new standard library module. To do that:

  1. Create the stdlib module itself; stdlib/ini.pkl
  2. Create a new class in org.pkl.core.runtime that extends StdlibModule, and add it to org.pkl.core.runtime.ModuleCache#getOrLoad (see the existing source code to look at what's currently already there).
  3. Create a class RendererNodes in new package org.pkl.core.stdlib.ini (see the other stdlib packages that are in there for reference)

You will also need to add language snippet tests for this renderer, in pkl-core/src/test/files/LanguageSnippetTests/input/api/

bioball avatar Feb 14 '24 01:02 bioball

Also make sure that you follow the contribution guidelines

moritztim avatar Feb 14 '24 07:02 moritztim

Created PR. Ill create the new in-language renderer soon and open another PR.

Thank you for the help.

Madmegsox1 avatar Feb 14 '24 09:02 Madmegsox1