Created
November 11, 2018 12:54
-
-
Save demonno/f9234ced664439986597cf7c3218d3b8 to your computer and use it in GitHub Desktop.
F# Type Provider Dependent Nested Types
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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