Skip to content

Instantly share code, notes, and snippets.

@demonno
Created November 11, 2018 12:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save demonno/f9234ced664439986597cf7c3218d3b8 to your computer and use it in GitHub Desktop.
Save demonno/f9234ced664439986597cf7c3218d3b8 to your computer and use it in GitHub Desktop.
F# Type Provider Dependent Nested Types
namespace Library
open Microsoft.FSharp.Core.CompilerServices
open ProviderImplementation.ProvidedTypes
[<TypeProvider>]
type SdmxProvider() as this =
inherit TypeProviderForNamespaces()
let asm = System.Reflection.Assembly.GetExecutingAssembly()
let ns = "Library.TypeProviders"
let createTypesForWsEntryPoint(weEntryPoint, sdmxTypeName) =
let resTy = ProvidedTypeDefinition(asm, ns, sdmxTypeName, None)
let serviceTypesType =
let t = ProvidedTypeDefinition("ServiceTypes", None)
resTy.AddMember t
t
let dimensionsType =
let t = ProvidedTypeDefinition("Dimensions", Some typeof<string>)
t.AddMembersDelayed (fun () ->
[ for dimension in [(1, "A1"); (1, "A2"); (1, "A3");
(2, "B1"); (2, "B2"); (2, "B3");
(3, "C1"); (3, "C2"); (3, "C3")] do
let dataflowId, dimensionName = dimension
let prop =
ProvidedProperty
( dimensionName, typeof<string>,
GetterCode = (fun args -> <@@ (%%args.[0]) :> string @@>))
yield prop
])
serviceTypesType.AddMember t
t
let dataflowsType =
let t = ProvidedTypeDefinition("Dataflows", Some typeof<string>)
t.AddMembersDelayed (fun () ->
[ for dataflow in [(1, "A"); (2, "B") ; (3, "C")] do
let dataflowId, dataflowName = dataflow
let prop = ProvidedProperty(dataflowName, dimensionsType, GetterCode = (fun args -> <@@ (%%args.[0]) :> string @@>))
yield prop])
serviceTypesType.AddMember t
t
resTy.AddMembersDelayed (fun () ->
[ yield ProvidedMethod(methodName = "GetDataFlowsContext",
parameters = [],
IsStaticMethod=true,
returnType = dataflowsType,
InvokeCode = (fun args ->
<@@ "Hello GetDataFlowsContext Method!" @@>))]
)
resTy
let instantiate typeName ([| :? string as entrypoint |]: obj array) =
createTypesForWsEntryPoint(entrypoint, typeName)
let sdmxType =
let sdmxProvTy = ProvidedTypeDefinition(asm, ns, "SdmxDataProvider", None)
sdmxProvTy.DefineStaticParameters(
[ProvidedStaticParameter("WsEntryPoint", typeof<string>)],
instantiate)
sdmxProvTy
// And add them to the namespace
do this.AddNamespace(ns, [sdmxType])
[<assembly:TypeProviderAssembly>]
do()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment