From b13f95a2505e96768d22df1219aba414f26f6882 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Tue, 8 Mar 2016 06:14:17 -0400 Subject: idea! --- .../type_level_privdata_availability_checking.mdwn | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 doc/todo/type_level_privdata_availability_checking.mdwn (limited to 'doc/todo') diff --git a/doc/todo/type_level_privdata_availability_checking.mdwn b/doc/todo/type_level_privdata_availability_checking.mdwn new file mode 100644 index 00000000..7f02c700 --- /dev/null +++ b/doc/todo/type_level_privdata_availability_checking.mdwn @@ -0,0 +1,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]] -- cgit v1.2.3