{-# language OverloadedStrings #-}
{-# language TypeApplications #-}
module Validation where

import qualified Data.Text.IO as Text

import Language.Python.DSL
import Language.Python.Render
import Language.Python.Validate

good_program :: Raw Module
good_program =
  module_
  [ line_ $
    def_ "a" [p_ "b", p_ "c"]
    [ line_ $ return_ ("b" .+ "c")
    ]
  ]

bad_program :: Raw Module
bad_program =
  module_
  [ line_ $
    def_ "a" [p_ "b", p_ "c"]
    [ line_ $ return_ ("b" .+ "d")
    ]
  ]

doValidating :: IO ()
doValidating = do
  putStrLn "Validating good program:\n"

  {-

  We can render unvalidated programs

  -}
  Text.putStrLn $ showModule good_program

  {-

  Validate the module for indentation, syntax, and scope correctness

  We use the type application specify the error type so that we can Show the
  result

  On success, we get back the same program we put in, but it has a slightly
  different type to indicate that it has been validated

  -}
  print $ validateModuleAll @(ValidationError ()) good_program

  putStrLn ""

  putStrLn "Validating bad program:\n"
  Text.putStrLn $ showModule bad_program

  {-

  On failure, we get back a non-empty list of errors that occurred

  -}
  print $ validateModuleAll @(ValidationError ()) bad_program