From 90fe2052a7f844d20cc4ce22587cf06cc22fbad4 Mon Sep 17 00:00:00 2001 From: Thanabodee Charoenpiriyakij Date: Sat, 22 Jun 2024 16:55:08 +0700 Subject: [PATCH] feat: call function work! And fix bug return list type broken. Signed-off-by: Thanabodee Charoenpiriyakij --- potato/dagger/Potato.sln | 44 +++++++------- potato/dagger/Potato/Potato.cs | 54 ++++++++--------- potato/dagger/Potato/PotatoPartial.cs | 16 +++++ potato/dagger/Potato/Program.cs | 2 +- sdk/Dagger.SDK.Mod/Entrypoint.cs | 58 +++++++++++++++++-- sdk/Dagger.SDK.Mod/IDagSetter.cs | 10 ++++ .../Code/CodeRenderer.cs | 2 +- 7 files changed, 128 insertions(+), 58 deletions(-) create mode 100644 potato/dagger/Potato/PotatoPartial.cs create mode 100644 sdk/Dagger.SDK.Mod/IDagSetter.cs diff --git a/potato/dagger/Potato.sln b/potato/dagger/Potato.sln index 2b5d78d..cd22aca 100644 --- a/potato/dagger/Potato.sln +++ b/potato/dagger/Potato.sln @@ -3,15 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK", "Dagger.SDK\Dagger.SDK.csproj", "{C61DDE53-77B2-4CA6-8AA3-323FCBE800F7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK", "Dagger.SDK\Dagger.SDK.csproj", "{4C63BF4F-BC14-42B0-864B-29A070CD5F44}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK.Mod", "Dagger.SDK.Mod\Dagger.SDK.Mod.csproj", "{5279A80F-A80C-42ED-B889-CD5A79814711}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK.Mod", "Dagger.SDK.Mod\Dagger.SDK.Mod.csproj", "{F59548DB-7902-4BDD-9040-C2127F98274E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dagger.SDK.SourceGenerator", "Dagger.SDK.SourceGenerator", "{AB7AD895-BE18-44E2-85AE-2B5B15144342}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dagger.SDK.SourceGenerator", "Dagger.SDK.SourceGenerator", "{317AA2C5-E06B-465A-9397-C1155FB98DE8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK.SourceGenerator", "Dagger.SDK.SourceGenerator\Dagger.SDK.SourceGenerator\Dagger.SDK.SourceGenerator.csproj", "{1E3342C8-6E9C-4D16-8EB2-C2745FFC1407}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dagger.SDK.SourceGenerator", "Dagger.SDK.SourceGenerator\Dagger.SDK.SourceGenerator\Dagger.SDK.SourceGenerator.csproj", "{5D165E5F-C483-4E0C-A017-3DF4C196D993}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Potato", "Potato\Potato.csproj", "{949887C2-420F-41F4-909F-2E6D30871173}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Potato", "Potato\Potato.csproj", "{D63DF656-43CC-4A93-AAF1-52590D6E1CB4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -22,24 +22,24 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {C61DDE53-77B2-4CA6-8AA3-323FCBE800F7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C61DDE53-77B2-4CA6-8AA3-323FCBE800F7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C61DDE53-77B2-4CA6-8AA3-323FCBE800F7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C61DDE53-77B2-4CA6-8AA3-323FCBE800F7}.Release|Any CPU.Build.0 = Release|Any CPU - {5279A80F-A80C-42ED-B889-CD5A79814711}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5279A80F-A80C-42ED-B889-CD5A79814711}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5279A80F-A80C-42ED-B889-CD5A79814711}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5279A80F-A80C-42ED-B889-CD5A79814711}.Release|Any CPU.Build.0 = Release|Any CPU - {1E3342C8-6E9C-4D16-8EB2-C2745FFC1407}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1E3342C8-6E9C-4D16-8EB2-C2745FFC1407}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1E3342C8-6E9C-4D16-8EB2-C2745FFC1407}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1E3342C8-6E9C-4D16-8EB2-C2745FFC1407}.Release|Any CPU.Build.0 = Release|Any CPU - {949887C2-420F-41F4-909F-2E6D30871173}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {949887C2-420F-41F4-909F-2E6D30871173}.Debug|Any CPU.Build.0 = Debug|Any CPU - {949887C2-420F-41F4-909F-2E6D30871173}.Release|Any CPU.ActiveCfg = Release|Any CPU - {949887C2-420F-41F4-909F-2E6D30871173}.Release|Any CPU.Build.0 = Release|Any CPU + {4C63BF4F-BC14-42B0-864B-29A070CD5F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C63BF4F-BC14-42B0-864B-29A070CD5F44}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C63BF4F-BC14-42B0-864B-29A070CD5F44}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C63BF4F-BC14-42B0-864B-29A070CD5F44}.Release|Any CPU.Build.0 = Release|Any CPU + {F59548DB-7902-4BDD-9040-C2127F98274E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F59548DB-7902-4BDD-9040-C2127F98274E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F59548DB-7902-4BDD-9040-C2127F98274E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F59548DB-7902-4BDD-9040-C2127F98274E}.Release|Any CPU.Build.0 = Release|Any CPU + {5D165E5F-C483-4E0C-A017-3DF4C196D993}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5D165E5F-C483-4E0C-A017-3DF4C196D993}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D165E5F-C483-4E0C-A017-3DF4C196D993}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5D165E5F-C483-4E0C-A017-3DF4C196D993}.Release|Any CPU.Build.0 = Release|Any CPU + {D63DF656-43CC-4A93-AAF1-52590D6E1CB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D63DF656-43CC-4A93-AAF1-52590D6E1CB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D63DF656-43CC-4A93-AAF1-52590D6E1CB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D63DF656-43CC-4A93-AAF1-52590D6E1CB4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {1E3342C8-6E9C-4D16-8EB2-C2745FFC1407} = {AB7AD895-BE18-44E2-85AE-2B5B15144342} + {5D165E5F-C483-4E0C-A017-3DF4C196D993} = {317AA2C5-E06B-465A-9397-C1155FB98DE8} EndGlobalSection EndGlobal diff --git a/potato/dagger/Potato/Potato.cs b/potato/dagger/Potato/Potato.cs index 1966875..bd608be 100644 --- a/potato/dagger/Potato/Potato.cs +++ b/potato/dagger/Potato/Potato.cs @@ -1,30 +1,26 @@ -using Dagger.SDK; -using Mod = Dagger.SDK.Mod; - -namespace Potato; - -public class BaseObject(Query dag) -{ - protected Query Dag { get; } = dag; -} - -[Mod.Object] -public class Potato(Query dag) : BaseObject(dag) -{ - [Mod.Function] - public async Task Echo(string name) - { - return await Dag.Container() - .From("alpine") - .WithExec(["echo", $"Hello, {name}"]) - .Stdout(); - } - - // [Mod.Function] - // public Container EchoContainer(string text) - // { - // return Dag.Container() - // .From("alpine") - // .WithExec(["echo", $"Hello, {text}"]); - // } +using Dagger.SDK; +using Mod = Dagger.SDK.Mod; + +namespace Potato; + +[Serializable] +[Mod.Object] +public partial class Potato() +{ + [Mod.Function] + public async Task Echo(string name) + { + return await _dag.Container() + .From("alpine") + .WithExec(["echo", $"Hello, {name}"]) + .Stdout(); + } + + // [Mod.Function] + // public Container EchoContainer(string text) + // { + // return Dag.Container() + // .From("alpine") + // .WithExec(["echo", $"Hello, {text}"]); + // } } \ No newline at end of file diff --git a/potato/dagger/Potato/PotatoPartial.cs b/potato/dagger/Potato/PotatoPartial.cs new file mode 100644 index 0000000..1008b4e --- /dev/null +++ b/potato/dagger/Potato/PotatoPartial.cs @@ -0,0 +1,16 @@ +using System.Text.Json.Serialization; +using Dagger.SDK; +using Dagger.SDK.Mod; + +namespace Potato; + +// QUESTION: can be done with source generator? +public partial class Potato : IDagSetter +{ + private Query _dag; + + public void SetDag(Query dag) + { + _dag = dag; + } +} \ No newline at end of file diff --git a/potato/dagger/Potato/Program.cs b/potato/dagger/Potato/Program.cs index 872e79c..e9d237e 100644 --- a/potato/dagger/Potato/Program.cs +++ b/potato/dagger/Potato/Program.cs @@ -3,6 +3,6 @@ public static async Task Main(string[] args) { var dag = Dagger.SDK.Dagger.Connect(); - await Dagger.SDK.Mod.Entrypoint.Invoke(dag, typeof(Potato.Potato)); + await Dagger.SDK.Mod.Entrypoint.Invoke(dag); } } \ No newline at end of file diff --git a/sdk/Dagger.SDK.Mod/Entrypoint.cs b/sdk/Dagger.SDK.Mod/Entrypoint.cs index de0286c..2ca87b9 100644 --- a/sdk/Dagger.SDK.Mod/Entrypoint.cs +++ b/sdk/Dagger.SDK.Mod/Entrypoint.cs @@ -5,22 +5,69 @@ namespace Dagger.SDK.Mod; public class Entrypoint { - public static async Task Invoke(Query dag, Type rootType) + public static async Task Invoke(Query dag) where T : class, IDagSetter { - FunctionCall fnCall = dag.CurrentFunctionCall(); - string parentName = await fnCall.ParentName(); + var rootType = typeof(T); + var fnCall = dag.CurrentFunctionCall(); + var parentName = await fnCall.ParentName(); // TODO: Get module name to check root type name match with it. - object result = parentName switch + var result = parentName switch { // TODO: Dagger.SDK should automatic serialize into id. "" => await Register(dag, dag.Module(), rootType).Id(), - _ => "" + _ => await DoInvoke(dag, fnCall) }; return await fnCall.ReturnValue(IntoJson(result)); } + private static async Task DoInvoke(Query dag, FunctionCall fnCall) where T : class, IDagSetter + { + var fnName = await fnCall.Name(); + var parentJson = await fnCall.Parent(); + var fnArgs = await fnCall.InputArgs(); + var parent = JsonSerializer.Deserialize(parentJson.Value); + parent.SetDag(dag); + // QUESTION: Can this be in source generator? + var parentType = parent.GetType(); + var method = parentType.GetMethod(fnName); + var methodParameters = method.GetParameters(); + + var inputArgs = new Dictionary(); + foreach (FunctionCallArgValue arg in fnArgs) + { + var name = await arg.Name(); + var value = await arg.Value(); + inputArgs[name] = JsonSerializer.Deserialize(value.Value); + } + + IEnumerable parameters = []; + foreach (var param in methodParameters) + { + if (param.ParameterType.Name == "String") + { + parameters = parameters.Append(inputArgs[param.Name].Deserialize()); + } + else + { + // BOOM! + parameters = parameters.Append(inputArgs[param.Name]); + } + } + + var result = method.Invoke(parent, parameters.ToArray())!; + // QUESTION: can source generator solve this issue? + if (result.GetType().IsGenericType) + { + var task = (Task)result; + await task.ConfigureAwait(false); + return task.GetType().GetProperty("Result").GetValue(task); + } + + return result; + } + private static Json IntoJson(object result) { return new Json { Value = JsonSerializer.Serialize(result) }; @@ -39,6 +86,7 @@ private static TypeDef RegisterFunctions(Query dag, TypeDef obj, MethodInfo[] me .Select(method => { var function = dag.Function( + // TODO: we need name convertion. method.Name, ReturnTypeDef(dag, method) ); diff --git a/sdk/Dagger.SDK.Mod/IDagSetter.cs b/sdk/Dagger.SDK.Mod/IDagSetter.cs new file mode 100644 index 0000000..1747ed1 --- /dev/null +++ b/sdk/Dagger.SDK.Mod/IDagSetter.cs @@ -0,0 +1,10 @@ +namespace Dagger.SDK.Mod; + +public interface IDagSetter +{ + /// + /// Set Dagger client instance. + /// + /// The Dagger client instance. + void SetDag(Query dag); +} diff --git a/sdk/Dagger.SDK.SourceGenerator/Dagger.SDK.SourceGenerator/Code/CodeRenderer.cs b/sdk/Dagger.SDK.SourceGenerator/Dagger.SDK.SourceGenerator/Code/CodeRenderer.cs index dbc1489..fe27f9b 100644 --- a/sdk/Dagger.SDK.SourceGenerator/Dagger.SDK.SourceGenerator/Code/CodeRenderer.cs +++ b/sdk/Dagger.SDK.SourceGenerator/Dagger.SDK.SourceGenerator/Code/CodeRenderer.cs @@ -248,7 +248,7 @@ private static string RenderReturnValue(Field field) (await Engine.ExecuteList<{typeName}Id>(GraphQLClient, queryBuilder)) .Select(id => new {typeName}( - QueryBuilder.Builder().Select("load{type}FromID", [new Argument("id", new StringValue(id.Value))]), + QueryBuilder.Builder().Select("load{typeName}FromID", [new Argument("id", new StringValue(id.Value))]), GraphQLClient ) )