module Did where
import Data.Text (Text)
import Bluesky.Did
testAccept :: Text -> IO ()
testAccept t = case makeDid t of
Left err -> error $ "Did not accept " <> show t <> ": " <> show err
Right _ -> pure ()
testReject :: DidError -> Text -> IO ()
testReject expectedErr t = case makeDid t of
Left actualErr
| expectedErr == actualErr -> pure ()
| otherwise -> error $ "Wrong error for " <> show t <> ": " <> show actualErr
Right _ -> error $ "Incorrectly accepted " <> show t
main :: IO ()
main = do
-- examples from the docs
mapM_ testAccept
[ -- valid and usable
"did:plc:z72i7hdynmk6r22z27h6tvur"
, "did:web:blueskyweb.xyz"
, -- syntactically valid but invalid method
"did:method:val:two"
, "did:m:v"
, "did:method::::val"
, "did:method:-:_:."
, "did:key:zQ3shZc2QzApp2oymGvQbzP8eKheVshBHbU4ZYjeXqwSKEn6N"
]
-- invalid syntax
testReject BadMethod "did:METHOD:val"
testReject BadMethod "did:m123:val"
testReject NoDidPrefix "DID:method:val"
testReject EndsWithColon "did:method:"
testReject BadIdentifierCharacters "did:method:val/two"
testReject BadIdentifierCharacters "did:method:val?two"
testReject BadIdentifierCharacters "did:method:val#two"
-- my own examples
testAccept "did:method:A:b"
-- percent encoding verification
testAccept "did:plc:%ff"
testAccept "did:plc:%F0"
testReject BadPercentEncoding "did:plc:%FG"