content: {-# 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