> One ask - make string interpolation great again?

I have a dream, that ExpressibleByStringInterpolation would allow to 
distinguish literal segments and embedded inputs.

Today, the documentation of this protocol [1] says:

        "One cookie: $\(price), \(number) cookies: $\(price * number)."
        // <=>
        let message = String(stringInterpolation:
                String(stringInterpolationSegment: "One cookie: $"),
                String(stringInterpolationSegment: price),
                String(stringInterpolationSegment: ", "),
                String(stringInterpolationSegment: number),
                String(stringInterpolationSegment: " cookies: $"),
                String(stringInterpolationSegment: price * number),
                String(stringInterpolationSegment: "."))

This means that ExpressibleByStringInterpolation can't distinguish "foo" from 
`bar` in "foo\(bar)".

If this distinction were possible, some nice features could emerge, such as 
context-sensitive escaping:

        // func render(_ html: HTML)
        let title = "<script>boom();</script>"
        render("<h1>\(title)</h1>") // escapes input
        
        // func query(_ sql: SQL)
        let name = "Robert'); DROP TABLE students; --"
        query("SELECT * FROM students WHERE name = \(name)") // avoids SQL 
injection

Ideally, a solution for multi-line literals (for strings and interpolated 
strings) would be found, too.

I wish the manifesto would address these topics as well :-)

Regards,
Gwendal Roué

[1] https://developer.apple.com/reference/swift/expressiblebystringinterpolation

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to