import System.Result.*
import System.*
import System.Console.*
import System.Storage.*

// Creates or replaces this file in the working directory.
func Save(path: string, text: string, limit: int) -> Result<System.Void, FileWriteError> {
    File.WriteAllText(path, text, limit)?
    WriteLine("Written")
    return Ok(())
}

func Load(path: string, limit: int) -> Result<string, FileReadError> {
    let text = File.ReadAllText(path, limit)?
    return Ok(text)
}

func ShowWrite(result: Result<System.Void, FileWriteError>) {
    match result {
        Ok(_) => WriteLine("Completed")
        Error(let error) => {
            if error.IsTooLarge {
                WriteLine("Write too large")
            } else {
                WriteLine("Write failed")
            }
        }
    }
}

func ShowRead(result: Result<string, FileReadError>) {
    match result {
        Ok(let ok) => WriteLine(ok)
        Error(let error) => {
            if error.IsNotFound {
                WriteLine("Not found")
            } else if error.IsTooLarge {
                WriteLine("Read too large")
            } else if error.IsInvalidUtf8 {
                WriteLine("Invalid UTF-8")
            } else if error.IsInvalidLimit {
                WriteLine("Invalid limit")
            } else {
                WriteLine("Read failed")
            }
        }
    }
}

func Main() {
    ShowWrite(Save("neoclr-file-demo.txt", "Hello, värld!", 64))
    ShowRead(Load("neoclr-file-demo.txt", 64))
    ShowWrite(Save("neoclr-file-demo.txt", "replacement", 2))
    ShowRead(Load("neoclr-file-demo.txt", 64))
    ShowRead(Load("neoclr-file-demo.txt", 2))
}
