jippi/dottie

Dottie doesn't handle multiline variables

intentionally-left-nil opened this issue · 6 comments

Create a .env file with:

multi="first
second"

Expected: Dottie parses multi as a variable containing a two-line value.
Actual: error
Error: unexpected token at line 2: Illegal(first) - parseRowStatement 1

I took a quick look and this is going to be a non-trivial fix.
The logic error begins with
scanQuotedValue

where it returns an error if a newline is found

if isEOF(s.rune) || isNewLine(s.rune) {
	tType = token.Illegal

	break
}

However, it's not as simple as removing the isNewLine check, because the Token struct makes assumptions that it is only applied over a single line. So E.g. the token length is wrong.

type Token struct {
	Type       Type
	Literal    string
	Offset     int
	Length     int
	LineNumber uint
	Commented  bool
	Quote      Quote
	Annotation *Annotation
}

So this is going to require some more heavy redesigning of your lexer to account for the fact that tokens can span multiple lines.

The other option I kind of considered would be a pre-processor pass to convert "hello
world"

to "hello\nworld" (with the literal \n in the string) but that has its own complexities (e.g. first you have to keep track of escaped sequences, find the proper closing quote etc.

and it feels like a better solution is just to fix the real logic of your scanner

P.P.S -

While I get that it's fun to write your own lexer/parser for your own code-> Have you considered any of the standardized formats over the last 50 years and reusing an existing tool? Especially as you're having other projects (pixelfed) use this library.

For example, for golang, there's goyacc https://www.dolthub.com/blog/2023-07-28-goyacc-parser-tips-tricks/ and you could replace most of this code with just your formal grammar of the .env file

There really aren't any consistent .env grammar out there, so many tools treat them differently, and my parser handles a bunch of those weird mixes rather well.

For Pixelfed; its quite easy to disable dottie syntax checking for cases where it does not work - it has however cause a lot of misconfigurations, so was left on by default for those use-cases :)

Ah nice, I missed that environment option :) Yay for chicken bits

intentionally designed it so all the nice and convenient validation and helpers can be disabled for folks who don't need it; or is hit by bugs (or lacks of features) and easily circumvent that and move on :)

Golden Path with easy off-ramps

I also fixed the issue in #41 :)