Languages/Rust/Rust-Language.ps.ps1

Language function Rust {
    <#
    .SYNOPSIS
        Rust PipeScript Language Definition
    .DESCRIPTION
        Defines Rust within PipeScript.

        This allows Rust to be templated.
    .EXAMPLE
        Invoke-PipeScript -ScriptBlock {
            $HelloWorldRustString = '
            fn main() {
                let msg = /*{param($msg = ''hello world'') "`"$msg`""}*/ ;
                println!("{}",msg);
            }
            '
            $HelloWorldRust = template HelloWorld_Rust.rs $HelloWorldRustString
            "$HelloWorldRust"
        }
    .EXAMPLE
        Invoke-PipeScript -ScriptBlock {
            $HelloWorldRust = template HelloWorld_Rust.rs '
            $HelloWorld = {param([Alias(''msg'')]$message = "Hello world") "`"$message`""}
            fn main() {
                let msg = /*{param($msg = ''hello world'') "`"$msg`""}*/ ;
                println!("{}",msg);
            }
            '
        
            $HelloWorldRust.Evaluate('hi')
            $HelloWorldRust.Save(@{Message='Hello'})
        }
    .EXAMPLE
        '
        fn main() {
            let msg = /*{param($msg = ''hello world'') "`"$msg`""}*/ ;
            println!("{}",msg);
        }
        ' | Set-Content .\HelloWorld_Rust.ps.rs

        Invoke-PipeScript .\HelloWorld_Rust.ps.rs
    .EXAMPLE
        $HelloWorld = {param([Alias('msg')]$message = "Hello world") "`"$message`""}
        "
        fn main() {
            let msg = /*{$HelloWorld}*/ ;
            println!(`"{}`",msg);
        }
        " | Set-Content .\HelloWorld_Rust.ps1.rs

        Invoke-PipeScript .\HelloWorld_Rust.ps1.rs -Parameter @{message='hi'}
    #>

    [ValidatePattern('\.rs$')]
    param()

    # Rust files end in .rs:
    $FilePattern  = '\.rs$'

    # Rust is case-sensitive
    $CaseSensitive = $true

    # A Rust Project file is described in a `Cargo.toml`.
    $ProjectFilePattern = 'Cargo.toml$'
    
    # They used C-style comments `/* */`
    $startComment = '/\*' # * Start Comments ```\*```
    $endComment   = '\*/' # * End Comments ```/*```
    
    $Whitespace   = '[\s\n\r]{0,}'
    # * StartPattern ```$IgnoredContext + $StartComment + '{' + $Whitespace```
    $StartPattern = "(?<PSStart>${startComment}\{$Whitespace)"
    # * EndPattern ```$whitespace + '}' + $EndComment + $ignoredContext```
    $EndPattern   = "(?<PSEnd>$Whitespace\}${endComment})"

    $compiler = 'rustc'

    $Website = 'https://www.rust-lang.org/'
    $ProjectUri = 'https://github.com/rust-lang/rust'
}