Skip to content

Commit

Permalink
feat: call function work!
Browse files Browse the repository at this point in the history
And fix bug return list type broken.

Signed-off-by: Thanabodee Charoenpiriyakij <[email protected]>
  • Loading branch information
wingyplus committed Jun 22, 2024
1 parent e69c2b3 commit 90fe205
Show file tree
Hide file tree
Showing 7 changed files with 128 additions and 58 deletions.
44 changes: 22 additions & 22 deletions potato/dagger/Potato.sln
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
54 changes: 25 additions & 29 deletions potato/dagger/Potato/Potato.cs
Original file line number Diff line number Diff line change
@@ -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<string> 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<string> 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}"]);
// }
}
16 changes: 16 additions & 0 deletions potato/dagger/Potato/PotatoPartial.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion potato/dagger/Potato/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Potato.Potato>(dag);
}
}
58 changes: 53 additions & 5 deletions sdk/Dagger.SDK.Mod/Entrypoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,69 @@ namespace Dagger.SDK.Mod;

public class Entrypoint
{
public static async Task<Void> Invoke(Query dag, Type rootType)
public static async Task<Void> Invoke<T>(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<T>(dag, fnCall)
};

return await fnCall.ReturnValue(IntoJson(result));
}

private static async Task<object> DoInvoke<T>(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<T>(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<string, JsonElement>();
foreach (FunctionCallArgValue arg in fnArgs)
{
var name = await arg.Name();
var value = await arg.Value();
inputArgs[name] = JsonSerializer.Deserialize<JsonElement>(value.Value);
}

IEnumerable<object?> parameters = [];
foreach (var param in methodParameters)
{
if (param.ParameterType.Name == "String")
{
parameters = parameters.Append(inputArgs[param.Name].Deserialize<string>());
}
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) };
Expand All @@ -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)
);
Expand Down
10 changes: 10 additions & 0 deletions sdk/Dagger.SDK.Mod/IDagSetter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace Dagger.SDK.Mod;

public interface IDagSetter
{
/// <summary>
/// Set Dagger client instance.
/// </summary>
/// <param name="dag">The Dagger client instance.</param>
void SetDag(Query dag);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
)
Expand Down

0 comments on commit 90fe205

Please sign in to comment.