summaryrefslogtreecommitdiff
path: root/doc/todo/type_level_privdata_availability_checking.mdwn
blob: 7f02c700fea94a3f69a9bfce792d1a03939a6459 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
When a property needs privdata to be set, it will fail at runtime when
it's not available. Could this be detected at compile time instead?

Here's an idea of a way to do it. Make propellor, whenever it adds/removes
privdata, generate a haskell source file, Propellor/PrivData/Available.hs

It would have one type-level function

	data Available
	type family HasPrivData source context
	type instance HasPrivData "password" "foo.com" = Available
	-- ^ supposed to be type level strings

The file would generate instances of the type family or each available privdata
value.

`withPrivData` would use this type level function, and require it to return
Availble. If it didn't, the type checker would blow up. 

(Controlling the type error message content to make it clear what went wrong
may be tricky.)

For this to work, `withPrivData` would need some interesting changes to its
type signature, so that it has available the type level strings describing
the privdata it's supposed to get. Is that practical? I think so,
actually..

	withPrivData :: (HasPrivData source context) => source -> context -> (((PrivData -> Propellor Result) -> Propellor Result) -> Property i) -> Property HasInfo

All that's needed is a way to provide a type level string from which a
string value can be extracted that has the same string as the type. IIRC,
that's supported by type level strings.

--[[Joey]]