Skip to content

Commit 3c46f32

Browse files
authored
Merge pull request #46 from input-output-hk/tdammers/typed-protocols-doc
Add typed-protocols-doc
2 parents 6ca30ec + 8b0e445 commit 3c46f32

File tree

23 files changed

+2955
-1
lines changed

23 files changed

+2955
-1
lines changed

.github/workflows/haskell.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ jobs:
7474
- name: typed-protocols-examples [test]
7575
run: cabal run typed-protocols-examples:test
7676

77+
- name: typed-protocols-doc [test]
78+
run: cabal test typed-protocols-doc
79+
7780
stylish-haskell:
7881
runs-on: ubuntu-22.04
7982

cabal.project

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ repository cardano-haskell-packages
1111
d4a35cd3121aa00d18544bb0ac01c3e1691d618f462c46129271bccf39f7e8ee
1212

1313
index-state:
14-
hackage.haskell.org 2023-11-08T09:44:54Z
14+
hackage.haskell.org 2024-02-06T12:00:00Z
1515
, cardano-haskell-packages 2023-05-16T03:39:10Z
1616

1717

1818
packages: ./typed-protocols
1919
./typed-protocols-cborg
2020
./typed-protocols-examples
21+
./typed-protocols-doc
2122

2223
test-show-details: direct

typed-protocols-doc/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
dist-newstyle

typed-protocols-doc/CHANGELOG.md

Whitespace-only changes.

typed-protocols-doc/LICENSE

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
2+
Apache License
3+
Version 2.0, January 2004
4+
http://www.apache.org/licenses/
5+
6+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7+
8+
1. Definitions.
9+
10+
"License" shall mean the terms and conditions for use, reproduction,
11+
and distribution as defined by Sections 1 through 9 of this document.
12+
13+
"Licensor" shall mean the copyright owner or entity authorized by
14+
the copyright owner that is granting the License.
15+
16+
"Legal Entity" shall mean the union of the acting entity and all
17+
other entities that control, are controlled by, or are under common
18+
control with that entity. For the purposes of this definition,
19+
"control" means (i) the power, direct or indirect, to cause the
20+
direction or management of such entity, whether by contract or
21+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
22+
outstanding shares, or (iii) beneficial ownership of such entity.
23+
24+
"You" (or "Your") shall mean an individual or Legal Entity
25+
exercising permissions granted by this License.
26+
27+
"Source" form shall mean the preferred form for making modifications,
28+
including but not limited to software source code, documentation
29+
source, and configuration files.
30+
31+
"Object" form shall mean any form resulting from mechanical
32+
transformation or translation of a Source form, including but
33+
not limited to compiled object code, generated documentation,
34+
and conversions to other media types.
35+
36+
"Work" shall mean the work of authorship, whether in Source or
37+
Object form, made available under the License, as indicated by a
38+
copyright notice that is included in or attached to the work
39+
(an example is provided in the Appendix below).
40+
41+
"Derivative Works" shall mean any work, whether in Source or Object
42+
form, that is based on (or derived from) the Work and for which the
43+
editorial revisions, annotations, elaborations, or other modifications
44+
represent, as a whole, an original work of authorship. For the purposes
45+
of this License, Derivative Works shall not include works that remain
46+
separable from, or merely link (or bind by name) to the interfaces of,
47+
the Work and Derivative Works thereof.
48+
49+
"Contribution" shall mean any work of authorship, including
50+
the original version of the Work and any modifications or additions
51+
to that Work or Derivative Works thereof, that is intentionally
52+
submitted to Licensor for inclusion in the Work by the copyright owner
53+
or by an individual or Legal Entity authorized to submit on behalf of
54+
the copyright owner. For the purposes of this definition, "submitted"
55+
means any form of electronic, verbal, or written communication sent
56+
to the Licensor or its representatives, including but not limited to
57+
communication on electronic mailing lists, source code control systems,
58+
and issue tracking systems that are managed by, or on behalf of, the
59+
Licensor for the purpose of discussing and improving the Work, but
60+
excluding communication that is conspicuously marked or otherwise
61+
designated in writing by the copyright owner as "Not a Contribution."
62+
63+
"Contributor" shall mean Licensor and any individual or Legal Entity
64+
on behalf of whom a Contribution has been received by Licensor and
65+
subsequently incorporated within the Work.
66+
67+
2. Grant of Copyright License. Subject to the terms and conditions of
68+
this License, each Contributor hereby grants to You a perpetual,
69+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70+
copyright license to reproduce, prepare Derivative Works of,
71+
publicly display, publicly perform, sublicense, and distribute the
72+
Work and such Derivative Works in Source or Object form.
73+
74+
3. Grant of Patent License. Subject to the terms and conditions of
75+
this License, each Contributor hereby grants to You a perpetual,
76+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77+
(except as stated in this section) patent license to make, have made,
78+
use, offer to sell, sell, import, and otherwise transfer the Work,
79+
where such license applies only to those patent claims licensable
80+
by such Contributor that are necessarily infringed by their
81+
Contribution(s) alone or by combination of their Contribution(s)
82+
with the Work to which such Contribution(s) was submitted. If You
83+
institute patent litigation against any entity (including a
84+
cross-claim or counterclaim in a lawsuit) alleging that the Work
85+
or a Contribution incorporated within the Work constitutes direct
86+
or contributory patent infringement, then any patent licenses
87+
granted to You under this License for that Work shall terminate
88+
as of the date such litigation is filed.
89+
90+
4. Redistribution. You may reproduce and distribute copies of the
91+
Work or Derivative Works thereof in any medium, with or without
92+
modifications, and in Source or Object form, provided that You
93+
meet the following conditions:
94+
95+
(a) You must give any other recipients of the Work or
96+
Derivative Works a copy of this License; and
97+
98+
(b) You must cause any modified files to carry prominent notices
99+
stating that You changed the files; and
100+
101+
(c) You must retain, in the Source form of any Derivative Works
102+
that You distribute, all copyright, patent, trademark, and
103+
attribution notices from the Source form of the Work,
104+
excluding those notices that do not pertain to any part of
105+
the Derivative Works; and
106+
107+
(d) If the Work includes a "NOTICE" text file as part of its
108+
distribution, then any Derivative Works that You distribute must
109+
include a readable copy of the attribution notices contained
110+
within such NOTICE file, excluding those notices that do not
111+
pertain to any part of the Derivative Works, in at least one
112+
of the following places: within a NOTICE text file distributed
113+
as part of the Derivative Works; within the Source form or
114+
documentation, if provided along with the Derivative Works; or,
115+
within a display generated by the Derivative Works, if and
116+
wherever such third-party notices normally appear. The contents
117+
of the NOTICE file are for informational purposes only and
118+
do not modify the License. You may add Your own attribution
119+
notices within Derivative Works that You distribute, alongside
120+
or as an addendum to the NOTICE text from the Work, provided
121+
that such additional attribution notices cannot be construed
122+
as modifying the License.
123+
124+
You may add Your own copyright statement to Your modifications and
125+
may provide additional or different license terms and conditions
126+
for use, reproduction, or distribution of Your modifications, or
127+
for any such Derivative Works as a whole, provided Your use,
128+
reproduction, and distribution of the Work otherwise complies with
129+
the conditions stated in this License.
130+
131+
5. Submission of Contributions. Unless You explicitly state otherwise,
132+
any Contribution intentionally submitted for inclusion in the Work
133+
by You to the Licensor shall be under the terms and conditions of
134+
this License, without any additional terms or conditions.
135+
Notwithstanding the above, nothing herein shall supersede or modify
136+
the terms of any separate license agreement you may have executed
137+
with Licensor regarding such Contributions.
138+
139+
6. Trademarks. This License does not grant permission to use the trade
140+
names, trademarks, service marks, or product names of the Licensor,
141+
except as required for reasonable and customary use in describing the
142+
origin of the Work and reproducing the content of the NOTICE file.
143+
144+
7. Disclaimer of Warranty. Unless required by applicable law or
145+
agreed to in writing, Licensor provides the Work (and each
146+
Contributor provides its Contributions) on an "AS IS" BASIS,
147+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148+
implied, including, without limitation, any warranties or conditions
149+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150+
PARTICULAR PURPOSE. You are solely responsible for determining the
151+
appropriateness of using or redistributing the Work and assume any
152+
risks associated with Your exercise of permissions under this License.
153+
154+
8. Limitation of Liability. In no event and under no legal theory,
155+
whether in tort (including negligence), contract, or otherwise,
156+
unless required by applicable law (such as deliberate and grossly
157+
negligent acts) or agreed to in writing, shall any Contributor be
158+
liable to You for damages, including any direct, indirect, special,
159+
incidental, or consequential damages of any character arising as a
160+
result of this License or out of the use or inability to use the
161+
Work (including but not limited to damages for loss of goodwill,
162+
work stoppage, computer failure or malfunction, or any and all
163+
other commercial damages or losses), even if such Contributor
164+
has been advised of the possibility of such damages.
165+
166+
9. Accepting Warranty or Additional Liability. While redistributing
167+
the Work or Derivative Works thereof, You may choose to offer,
168+
and charge a fee for, acceptance of support, warranty, indemnity,
169+
or other liability obligations and/or rights consistent with this
170+
License. However, in accepting such obligations, You may act only
171+
on Your own behalf and on Your sole responsibility, not on behalf
172+
of any other Contributor, and only if You agree to indemnify,
173+
defend, and hold each Contributor harmless for any liability
174+
incurred by, or claims asserted against, such Contributor by reason
175+
of your accepting any such warranty or additional liability.
176+
177+
END OF TERMS AND CONDITIONS

typed-protocols-doc/NOTICE

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Copyright 2019-2024 Input Output Global Inc (IOG)
2+
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
14+

typed-protocols-doc/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
typed-protocols-doc
2+
===================
3+
4+
Automatically generates HTML documentation for protocols defined with
5+
[typed-protocols](https://input-output-hk.github.io/typed-protocols/typed-protocols/Network-TypedProtocol.html)
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE DerivingVia #-}
3+
{-# LANGUAGE EmptyCase #-}
4+
{-# LANGUAGE FlexibleContexts #-}
5+
{-# LANGUAGE FlexibleInstances #-}
6+
{-# LANGUAGE GADTs #-}
7+
{-# LANGUAGE MultiParamTypeClasses #-}
8+
{-# LANGUAGE StandaloneDeriving #-}
9+
{-# LANGUAGE TypeApplications #-}
10+
{-# LANGUAGE TypeFamilies #-}
11+
{-# LANGUAGE UndecidableInstances #-}
12+
{-# LANGUAGE ScopedTypeVariables #-}
13+
{-# LANGUAGE TemplateHaskell #-}
14+
15+
module DemoProtocol
16+
where
17+
18+
import Network.TypedProtocol.Core
19+
import Data.SerDoc.Info
20+
import Control.Monad.Identity
21+
import Control.Monad.Except
22+
import Data.Proxy
23+
import Data.Word
24+
import Data.Typeable
25+
import Data.SerDoc.Class
26+
import Data.SerDoc.TH
27+
import Data.Text (Text)
28+
29+
data PongInfo =
30+
PongInfo
31+
{ pongTimestamp :: Word64
32+
, pongPeerID :: Word64
33+
, pongMessage :: Text
34+
}
35+
deriving (Show, Eq)
36+
37+
data DemoProtocol a where
38+
-- | Idle state: server waits for ping.
39+
IdleState :: DemoProtocol a
40+
41+
-- | Awaiting pong state: server has received ping, client waits for pong.
42+
AwaitingPongState :: DemoProtocol a
43+
44+
-- | End state: either side has terminated the session
45+
EndState :: DemoProtocol a
46+
47+
instance Protocol (DemoProtocol a) where
48+
data Message (DemoProtocol a) st st' where
49+
PingMessage :: Message (DemoProtocol a) IdleState AwaitingPongState
50+
PongMessage :: Message (DemoProtocol a) AwaitingPongState IdleState
51+
ComplexPongMessage :: Message (DemoProtocol a) AwaitingPongState IdleState
52+
EndMessage :: Message (DemoProtocol a) st EndState
53+
54+
data ServerHasAgency st where
55+
TokIdle :: ServerHasAgency IdleState
56+
57+
data ClientHasAgency st where
58+
TokAwaitingPongState :: ClientHasAgency AwaitingPongState
59+
60+
data NobodyHasAgency st where
61+
TokEnd :: NobodyHasAgency EndState
62+
63+
64+
exclusionLemma_ClientAndServerHaveAgency tok1 tok2 =
65+
case tok1 of
66+
TokAwaitingPongState -> case tok2 of {}
67+
68+
exclusionLemma_NobodyAndClientHaveAgency tok1 tok2 =
69+
case tok1 of
70+
TokEnd -> case tok2 of {}
71+
72+
exclusionLemma_NobodyAndServerHaveAgency tok1 tok2 =
73+
case tok1 of
74+
TokEnd -> case tok2 of {}
75+
76+
data DemoCodec a
77+
78+
instance Codec (DemoCodec a) where
79+
type MonadEncode (DemoCodec a) = Identity
80+
type MonadDecode (DemoCodec a) = Except String
81+
82+
data PongEnum = NormalPong | ComplexPong
83+
deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
84+
85+
data PingEnum = PingRequest | EndPing
86+
deriving (Show, Read, Eq, Ord, Enum, Bounded, Typeable)
87+
88+
deriving via (ViaEnum PongEnum)
89+
instance (Codec codec, HasInfo codec (DefEnumEncoding codec)) => HasInfo codec PongEnum
90+
91+
deriving via (ViaEnum PingEnum)
92+
instance (Codec codec, HasInfo codec (DefEnumEncoding codec)) => HasInfo codec PingEnum
93+
94+
instance HasInfo (DemoCodec b) () where
95+
info _ _ = basicField "()" (FixedSize 0)
96+
97+
instance HasInfo (DemoCodec b) Text where
98+
info codec _ =
99+
compoundField "Text"
100+
[ ("length", info codec (Proxy @Word32))
101+
, ("data", basicField "UTF8 dat" (FixedSize 0))
102+
]
103+
104+
instance HasInfo (DemoCodec b) a => HasInfo (DemoCodec b) [a] where
105+
info codec (_ :: Proxy [a]) =
106+
compoundField "List"
107+
[ ( "length", info codec (Proxy @Word32))
108+
, ( "values"
109+
, listField (VarSize "length") (info codec (Proxy @a))
110+
)
111+
]
112+
113+
114+
instance HasInfo (DemoCodec b) a => HasInfo (DemoCodec b) (Maybe a) where
115+
info codec (_ :: Proxy (Maybe a)) =
116+
compoundField "Maybe"
117+
[ ("isJust", info codec (Proxy @Word32))
118+
, ( "value"
119+
, sumField "isJust"
120+
[ ("Nothing", info codec (Proxy @()))
121+
, ("Just", info codec (Proxy @a))
122+
]
123+
)
124+
]
125+
126+
instance HasInfo (DemoCodec b) (Message (DemoProtocol a) IdleState AwaitingPongState) where
127+
info codec _ = infoOf "PingRequest" $ info codec (Proxy @PingEnum)
128+
129+
instance HasInfo (DemoCodec b) (Message (DemoProtocol a) st EndState) where
130+
info codec _ = infoOf "EndPing" $ info codec (Proxy @PingEnum)
131+
132+
instance HasInfo (DemoCodec a) Word16 where
133+
info _ _ = basicField "Word16" (FixedSize 2)
134+
135+
instance HasInfo (DemoCodec a) Word32 where
136+
info _ _ = basicField "Word32" (FixedSize 4)
137+
138+
instance HasInfo (DemoCodec a) Word64 where
139+
info _ _ = basicField "Word64" (FixedSize 8)
140+
141+
$(deriveSerDoc ''DemoCodec [] ''PongInfo)
142+
143+
instance HasInfo (DemoCodec b) (Message (DemoProtocol a) AwaitingPongState IdleState) where
144+
info codec _ =
145+
compoundField "Pong"
146+
[ ("pongType", info codec (Proxy @PongEnum))
147+
, ("pongData"
148+
, choiceField
149+
(IndexField "pongType")
150+
[ info codec (Proxy @())
151+
, info codec (Proxy @PongInfo)
152+
]
153+
)
154+
]

0 commit comments

Comments
 (0)