capnp-0.4.0.0: cmd/capnpc-haskell/Check.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
module Check (reportIssues) where
import Data.Foldable (for_)
import System.IO (hPutStrLn, stderr)
import qualified Data.Vector as V
import Capnp.Gen.Capnp.Schema.Pure
-- | Scan the code generator request for certain issues, and warn the user
-- if found.
--
-- We still assume the input is *valid*, so these are issues regarding things
-- that our implementation can't handle.
reportIssues :: CodeGeneratorRequest -> IO ()
reportIssues CodeGeneratorRequest{nodes} =
let problemFields =
[ (displayName, name)
| Node{displayName, union'=Node'struct Node'struct'{fields}} <- V.toList nodes
, Field
{ name
, union'=Field'slot Field'slot'{hadExplicitDefault, defaultValue}
} <- V.toList fields
, hadExplicitDefault && isPtrValue defaultValue
]
in
for_ problemFields $ \(displayName, name) ->
hPutStrLn stderr $ concat
[ "WARNING: the field ", show name, " in ", show displayName, "\n"
, " has a custom default value, but haskell-capnp does not\n"
, " support this for pointer-valued fields. The custom\n"
, " default will be ignored; please be careful. See:\n"
, "\n"
, "https://github.com/zenhack/haskell-capnp/issues/28\n"
, "\n"
, "for more information.\n"
]
isPtrValue :: Value -> Bool
isPtrValue = \case
Value'void -> False
Value'bool _ -> False
Value'int8 _ -> False
Value'int16 _ -> False
Value'int32 _ -> False
Value'int64 _ -> False
Value'uint8 _ -> False
Value'uint16 _ -> False
Value'uint32 _ -> False
Value'uint64 _ -> False
Value'float32 _ -> False
Value'float64 _ -> False
Value'enum _ -> False
_ -> True