Improve error messages for CRD support (#117)

This commit is contained in:
Gabriel Gonzalez 2020-05-08 09:02:12 -07:00 committed by GitHub
parent fc275e649b
commit 9badc02688
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 22 deletions

View File

@ -1,5 +1,6 @@
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE QuasiQuotes #-}
module Dhall.Kubernetes.Convert
( toTypes
@ -19,13 +20,13 @@ import Data.Text (Text)
import Dhall.Kubernetes.Types
import GHC.Generics (Generic, Rep)
import qualified Data.Char as Char
import qualified Data.List as List
import qualified Data.Map.Strict as Data.Map
import qualified Data.Set as Set
import qualified Data.Sort as Sort
import qualified Data.Text as Text
import qualified Dhall.Core as Dhall
import qualified Data.Char as Char
import qualified Data.List as List
import qualified Data.Map.Strict as Data.Map
import qualified Data.Set as Set
import qualified Data.Sort as Sort
import qualified Data.Text as Text
import qualified Dhall.Core as Dhall
import qualified Dhall.Map
import qualified Dhall.Optics
@ -356,26 +357,37 @@ mkV1beta1JSONSchemaProps =
, v1beta1JSONSchemaPropsType = Nothing
}
toDefinition :: V1beta1CustomResourceDefinition -> Maybe (ModelName, Definition)
toDefinition crd =
fmap (\d -> (modelName, d)) definition
orDie :: Maybe a -> e -> Either e a
Just r `orDie` _ = Right r
Nothing `orDie` l = Left l
toDefinition
:: V1beta1CustomResourceDefinition -> Either Text (ModelName, Definition)
toDefinition crd = fmap (\d -> (modelName, d)) definition
where
spec = v1beta1CustomResourceDefinitionSpec crd
group = v1beta1CustomResourceDefinitionSpecGroup spec
crdKind = (v1beta1CustomResourceDefinitionNamesKind . v1beta1CustomResourceDefinitionSpecNames) spec
modelName = ModelName (group <> "." <> crdKind)
definition = do
let
versionName xs = case xs of
(x:_) -> Just (v1beta1CustomResourceDefinitionVersionName x)
_ -> Nothing
version <-
v1beta1CustomResourceDefinitionSpecVersion spec
<|> do
versions <- v1beta1CustomResourceDefinitionSpecVersions spec
versionName versions
let versionName xs = case xs of
x:_ -> pure (v1beta1CustomResourceDefinitionVersionName x)
_ -> empty
let inferVersion =
v1beta1CustomResourceDefinitionSpecVersion spec
<|> do versions <- v1beta1CustomResourceDefinitionSpecVersions spec
versionName versions
version <- inferVersion
`orDie` "The CustomResourceDefinitionSpec is missing both the version and versions fields"
validation <- v1beta1CustomResourceDefinitionSpecValidation spec
`orDie` "The CustomResourceDefinitionSpec is missing the validation field"
schema <- v1beta1CustomResourceValidationOpenApiv3Schema validation
`orDie` "The CustomResourceValidation is missing the openApiv3Schema field"
let baseData = BaseData {
kind = crdKind,
apiVersion = version

View File

@ -7,7 +7,6 @@ import Control.Applicative.Combinators (sepBy1, option)
import Data.Aeson (decodeFileStrict)
import Data.Bifunctor (bimap)
import Data.Foldable (for_)
import Data.Maybe (maybeToList)
import Data.Text (Text, pack)
import Data.Void (Void)
import Data.Yaml
@ -231,8 +230,14 @@ main = do
if crd then do
crdFile <- decodeFileEither filename
case crdFile of
Left e -> fail $ "Unable to decode the CRD file. " <> show e
Right s -> (pure . Data.Map.fromList . maybeToList . Convert.toDefinition) s
Left e -> do
fail $ "Unable to decode the CRD file. " <> show e
Right s -> do
case Convert.toDefinition s of
Left text -> do
fail (Text.unpack text)
Right result -> do
return (Data.Map.fromList [result])
else do
swaggerFile <- decodeFileStrict filename
case swaggerFile of