From 34e3eabdd608fdcc2326c137d77029f2b577098c Mon Sep 17 00:00:00 2001 From: Vasek - Tom C Date: Fri, 20 Dec 2024 14:00:14 +0100 Subject: [PATCH] feat: add magicsdk Signed-off-by: Vasek - Tom C --- magic_sdk_test/Dockerfile | 11 ++ magic_sdk_test/dagger.json | 5 + magic_sdk_test/go.mod | 3 + magic_sdk_test/main.go | 7 + magicsdk/.gitattributes | 4 + magicsdk/.gitignore | 4 + magicsdk/dagger.json | 6 + magicsdk/go.mod | 51 ++++++ magicsdk/go.sum | 85 ++++++++++ magicsdk/magic_sdk/codebase/codebase.go | 43 ++++++ magicsdk/magic_sdk/go.mod | 42 +++++ magicsdk/magic_sdk/go.sum | 73 +++++++++ magicsdk/magic_sdk/integration/docker.go | 72 +++++++++ magicsdk/magic_sdk/integration/integration.go | 49 ++++++ magicsdk/magic_sdk/invocation/invocation.go | 8 + magicsdk/magic_sdk/main.go | 24 +++ magicsdk/magic_sdk/module/module.go | 146 ++++++++++++++++++ magicsdk/main.go | 43 ++++++ 18 files changed, 676 insertions(+) create mode 100644 magic_sdk_test/Dockerfile create mode 100644 magic_sdk_test/dagger.json create mode 100644 magic_sdk_test/go.mod create mode 100644 magic_sdk_test/main.go create mode 100644 magicsdk/.gitattributes create mode 100644 magicsdk/.gitignore create mode 100644 magicsdk/dagger.json create mode 100644 magicsdk/go.mod create mode 100644 magicsdk/go.sum create mode 100644 magicsdk/magic_sdk/codebase/codebase.go create mode 100644 magicsdk/magic_sdk/go.mod create mode 100644 magicsdk/magic_sdk/go.sum create mode 100644 magicsdk/magic_sdk/integration/docker.go create mode 100644 magicsdk/magic_sdk/integration/integration.go create mode 100644 magicsdk/magic_sdk/invocation/invocation.go create mode 100644 magicsdk/magic_sdk/main.go create mode 100644 magicsdk/magic_sdk/module/module.go create mode 100644 magicsdk/main.go diff --git a/magic_sdk_test/Dockerfile b/magic_sdk_test/Dockerfile new file mode 100644 index 0000000..4dda968 --- /dev/null +++ b/magic_sdk_test/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.23.2-alpine + +WORKDIR /app + +COPY go.mod go.mod +COPY go.sum go.sum +COPY main.go main.go + +RUN go mod download + +RUN go build -o /app/main . \ No newline at end of file diff --git a/magic_sdk_test/dagger.json b/magic_sdk_test/dagger.json new file mode 100644 index 0000000..517582c --- /dev/null +++ b/magic_sdk_test/dagger.json @@ -0,0 +1,5 @@ +{ + "name": "test", + "engineVersion": "v0.15.1", + "sdk": "../magicsdk" +} diff --git a/magic_sdk_test/go.mod b/magic_sdk_test/go.mod new file mode 100644 index 0000000..2e5e3d0 --- /dev/null +++ b/magic_sdk_test/go.mod @@ -0,0 +1,3 @@ +module demo.test + +go 1.23.2 diff --git a/magic_sdk_test/main.go b/magic_sdk_test/main.go new file mode 100644 index 0000000..d3e7ff3 --- /dev/null +++ b/magic_sdk_test/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, world!") +} \ No newline at end of file diff --git a/magicsdk/.gitattributes b/magicsdk/.gitattributes new file mode 100644 index 0000000..3a45493 --- /dev/null +++ b/magicsdk/.gitattributes @@ -0,0 +1,4 @@ +/dagger.gen.go linguist-generated +/internal/dagger/** linguist-generated +/internal/querybuilder/** linguist-generated +/internal/telemetry/** linguist-generated diff --git a/magicsdk/.gitignore b/magicsdk/.gitignore new file mode 100644 index 0000000..7ebabcc --- /dev/null +++ b/magicsdk/.gitignore @@ -0,0 +1,4 @@ +/dagger.gen.go +/internal/dagger +/internal/querybuilder +/internal/telemetry diff --git a/magicsdk/dagger.json b/magicsdk/dagger.json new file mode 100644 index 0000000..a24ce2b --- /dev/null +++ b/magicsdk/dagger.json @@ -0,0 +1,6 @@ +{ + "name": "magicsdk", + "engineVersion": "v0.15.1", + "sdk": "go", + "source": "." +} diff --git a/magicsdk/go.mod b/magicsdk/go.mod new file mode 100644 index 0000000..906fba8 --- /dev/null +++ b/magicsdk/go.mod @@ -0,0 +1,51 @@ +module dagger/magicsdk + +go 1.23.2 + +require ( + github.com/99designs/gqlgen v0.17.57 + github.com/Khan/genqlient v0.7.0 + github.com/vektah/gqlparser/v2 v2.5.19 + go.opentelemetry.io/otel v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 + go.opentelemetry.io/otel/log v0.3.0 + go.opentelemetry.io/otel/metric v1.27.0 + go.opentelemetry.io/otel/sdk v1.27.0 + go.opentelemetry.io/otel/sdk/log v0.3.0 + go.opentelemetry.io/otel/sdk/metric v1.27.0 + go.opentelemetry.io/otel/trace v1.27.0 + go.opentelemetry.io/proto/otlp v1.3.1 + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa + golang.org/x/sync v0.10.0 + google.golang.org/grpc v1.68.0 +) + +require ( + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/stretchr/testify v1.10.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/protobuf v1.35.2 // indirect +) + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 + +replace go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp => go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 + +replace go.opentelemetry.io/otel/log => go.opentelemetry.io/otel/log v0.3.0 + +replace go.opentelemetry.io/otel/sdk/log => go.opentelemetry.io/otel/sdk/log v0.3.0 diff --git a/magicsdk/go.sum b/magicsdk/go.sum new file mode 100644 index 0000000..e566804 --- /dev/null +++ b/magicsdk/go.sum @@ -0,0 +1,85 @@ +github.com/99designs/gqlgen v0.17.57 h1:Ak4p60BRq6QibxY0lEc0JnQhDurfhxA67sp02lMjmPc= +github.com/99designs/gqlgen v0.17.57/go.mod h1:Jx61hzOSTcR4VJy/HFIgXiQ5rJ0Ypw8DxWLjbYDAUw0= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/vektah/gqlparser/v2 v2.5.19 h1:bhCPCX1D4WWzCDvkPl4+TP1N8/kLrWnp43egplt7iSg= +github.com/vektah/gqlparser/v2 v2.5.19/go.mod h1:y7kvl5bBlDeuWIvLtA9849ncyvx6/lj06RsMrEjVy3U= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= +go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= +go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= +go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/magicsdk/magic_sdk/codebase/codebase.go b/magicsdk/magic_sdk/codebase/codebase.go new file mode 100644 index 0000000..2363b5b --- /dev/null +++ b/magicsdk/magic_sdk/codebase/codebase.go @@ -0,0 +1,43 @@ +package codebase + +import ( + "fmt" + "os" +) + +type Codebase struct { + Path string + + dir []os.DirEntry +} + +func New(path string) (*Codebase, error) { + fmt.Printf("Reading codebase at %s\n", path) + + dir, err := os.ReadDir(path) + if err != nil { + return nil, fmt.Errorf("failed to read directory: %w", err) + } + + return &Codebase{ + Path: path, + dir: dir, + }, nil +} + +func (c *Codebase) LookupFile(name string) (*os.File, error, bool) { + for _, entry := range c.dir { + fmt.Printf("Checking file %s\n", entry.Name()) + + if entry.Name() == name { + file, err := os.Open(c.Path + "/" + entry.Name()) + if err != nil { + return nil, err, false + } + + return file, nil, true + } + } + + return nil, nil, false +} \ No newline at end of file diff --git a/magicsdk/magic_sdk/go.mod b/magicsdk/magic_sdk/go.mod new file mode 100644 index 0000000..6bc155b --- /dev/null +++ b/magicsdk/magic_sdk/go.mod @@ -0,0 +1,42 @@ +module dagger.io/magicsdk + +go 1.23.2 + +require ( + dagger.io/dagger v0.15.1 // indirect + github.com/99designs/gqlgen v0.17.57 // indirect + github.com/Khan/genqlient v0.7.0 // indirect + github.com/adrg/xdg v0.5.3 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/vektah/gqlparser/v2 v2.5.19 // indirect + go.opentelemetry.io/otel v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 // indirect + go.opentelemetry.io/otel/log v0.3.0 // indirect + go.opentelemetry.io/otel/metric v1.27.0 // indirect + go.opentelemetry.io/otel/sdk v1.27.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.3.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.27.0 // indirect + go.opentelemetry.io/otel/trace v1.27.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/grpc v1.68.0 // indirect + google.golang.org/protobuf v1.35.2 // indirect +) diff --git a/magicsdk/magic_sdk/go.sum b/magicsdk/magic_sdk/go.sum new file mode 100644 index 0000000..8759a17 --- /dev/null +++ b/magicsdk/magic_sdk/go.sum @@ -0,0 +1,73 @@ +dagger.io/dagger v0.15.1 h1:2faeBRf/3gTPGcjcej44fu/V81SIDhu+UjYn3hUJuIE= +dagger.io/dagger v0.15.1/go.mod h1:orbqkxrktOSvhUr8+Iyl9sRfjENvkX/Vdo31b2ers5c= +github.com/99designs/gqlgen v0.17.57 h1:Ak4p60BRq6QibxY0lEc0JnQhDurfhxA67sp02lMjmPc= +github.com/99designs/gqlgen v0.17.57/go.mod h1:Jx61hzOSTcR4VJy/HFIgXiQ5rJ0Ypw8DxWLjbYDAUw0= +github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= +github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= +github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= +github.com/adrg/xdg v0.5.3/go.mod h1:nlTsY+NNiCBGCK2tpm09vRqfVzrc2fLmXGpBLF0zlTQ= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/vektah/gqlparser/v2 v2.5.19 h1:bhCPCX1D4WWzCDvkPl4+TP1N8/kLrWnp43egplt7iSg= +github.com/vektah/gqlparser/v2 v2.5.19/go.mod h1:y7kvl5bBlDeuWIvLtA9849ncyvx6/lj06RsMrEjVy3U= +go.opentelemetry.io/otel v1.27.0 h1:9BZoF3yMK/O1AafMiQTVu0YDj5Ea4hPhxCs7sGva+cg= +go.opentelemetry.io/otel v1.27.0/go.mod h1:DMpAK8fzYRzs+bi3rS5REupisuqTheUlSZJ1WnZaPAQ= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0 h1:ccBrA8nCY5mM0y5uO7FT0ze4S0TuFcWdDB2FxGMTjkI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.3.0/go.mod h1:/9pb6634zi2Lk8LYg9Q0X8Ar6jka4dkFOylBLbVQPCE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0 h1:bFgvUr3/O4PHj3VQcFEuYKvRZJX1SJDQ+11JXuSB3/w= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.27.0/go.mod h1:xJntEd2KL6Qdg5lwp97HMLQDVeAhrYxmzFseAMDPQ8I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0 h1:CIHWikMsN3wO+wq1Tp5VGdVRTcON+DmOJSfDjXypKOc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.27.0/go.mod h1:TNupZ6cxqyFEpLXAZW7On+mLFL0/g0TE3unIYL91xWc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0 h1:R9DE4kQ4k+YtfLI2ULwX82VtNQ2J8yZmA7ZIF/D+7Mc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.27.0/go.mod h1:OQFyQVrDlbe+R7xrEyDr/2Wr67Ol0hRUgsfA+V5A95s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0 h1:qFffATk0X+HD+f1Z8lswGiOQYKHRlzfmdJm0wEaVrFA= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h1:MOiCmryaYtc+V0Ei+Tx9o5S1ZjA7kzLucuVuyzBZloQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0 h1:QY7/0NeRPKlzusf40ZE4t1VlMKbqSNT7cJRYzWuja0s= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.27.0/go.mod h1:HVkSiDhTM9BoUJU8qE6j2eSWLLXvi1USXjyd2BXT8PY= +go.opentelemetry.io/otel/log v0.3.0 h1:kJRFkpUFYtny37NQzL386WbznUByZx186DpEMKhEGZs= +go.opentelemetry.io/otel/log v0.3.0/go.mod h1:ziCwqZr9soYDwGNbIL+6kAvQC+ANvjgG367HVcyR/ys= +go.opentelemetry.io/otel/metric v1.27.0 h1:hvj3vdEKyeCi4YaYfNjv2NUje8FqKqUY8IlF0FxV/ik= +go.opentelemetry.io/otel/metric v1.27.0/go.mod h1:mVFgmRlhljgBiuk/MP/oKylr4hs85GZAylncepAX/ak= +go.opentelemetry.io/otel/sdk v1.27.0 h1:mlk+/Y1gLPLn84U4tI8d3GNJmGT/eXe3ZuOXN9kTWmI= +go.opentelemetry.io/otel/sdk v1.27.0/go.mod h1:Ha9vbLwJE6W86YstIywK2xFfPjbWlCuwPtMkKdz/Y4A= +go.opentelemetry.io/otel/sdk/log v0.3.0 h1:GEjJ8iftz2l+XO1GF2856r7yYVh74URiF9JMcAacr5U= +go.opentelemetry.io/otel/sdk/log v0.3.0/go.mod h1:BwCxtmux6ACLuys1wlbc0+vGBd+xytjmjajwqqIul2g= +go.opentelemetry.io/otel/sdk/metric v1.27.0 h1:5uGNOlpXi+Hbo/DRoI31BSb1v+OGcpv2NemcCrOL8gI= +go.opentelemetry.io/otel/sdk/metric v1.27.0/go.mod h1:we7jJVrYN2kh3mVBlswtPU22K0SA+769l93J6bsyvqw= +go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= +go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.68.0 h1:aHQeeJbo8zAkAa3pRzrVjZlbz6uSfeOXlJNQM0RAbz0= +google.golang.org/grpc v1.68.0/go.mod h1:fmSPC5AsjSBCK54MyHRx48kpOti1/jRfOlwEWywNjWA= +google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= diff --git a/magicsdk/magic_sdk/integration/docker.go b/magicsdk/magic_sdk/integration/docker.go new file mode 100644 index 0000000..f75f313 --- /dev/null +++ b/magicsdk/magic_sdk/integration/docker.go @@ -0,0 +1,72 @@ +package integration + +import ( + "context" + "encoding/json" + "fmt" + + "dagger.io/dagger" + "dagger.io/dagger/dag" + "dagger.io/magicsdk/codebase" + "dagger.io/magicsdk/invocation" +) + +type Docker struct { + supported bool +} + +func DockerIntegration(code *codebase.Codebase) (Integration, error) { + _, err, exist := code.LookupFile("Dockerfile") + if err != nil { + return nil, fmt.Errorf("failed to lookup for Dockerfile: %w", err) + } + + return &Docker{ + supported: exist, + }, nil +} + +func (d *Docker) Exist() bool { + return d.supported +} + +func (d *Docker) TypeDef() *dagger.TypeDef { + return dag. + TypeDef(). + WithObject("Docker"). + WithFunction( + dag.Function("Build", dag.TypeDef().WithObject("Container")). + WithDescription("Build a container from a Dockerfile"), + ) +} + +func (d *Docker) Build(ctx context.Context) (*dagger.Container, error) { + return dag.Container().From("alpine").WithExec([]string{"echo", "Hello from Docker!"}), nil +} + +func (d *Docker) Invoke(ctx context.Context, invocation *invocation.Invocation) (_ any, err error) { + switch invocation.FnName { + case "": + { + var parent Docker + err = json.Unmarshal(invocation.ParentJSON, &parent) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal parent object: %w", err) + } + + return &Docker{}, nil + } + case "Build": + { + var parent Docker + err = json.Unmarshal(invocation.ParentJSON, &parent) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal parent object: %w", err) + } + + return (*Docker).Build(&parent, ctx) + } + default: + return nil, fmt.Errorf("unknown function %s", invocation.FnName) + } +} diff --git a/magicsdk/magic_sdk/integration/integration.go b/magicsdk/magic_sdk/integration/integration.go new file mode 100644 index 0000000..ec0b9b1 --- /dev/null +++ b/magicsdk/magic_sdk/integration/integration.go @@ -0,0 +1,49 @@ +package integration + +import ( + "context" + "fmt" + + "dagger.io/dagger" + "dagger.io/magicsdk/codebase" + "dagger.io/magicsdk/invocation" +) + +type Integrations map[string]Integration + +type Integration interface { + Exist() bool + + TypeDef() *dagger.TypeDef + + Invoke(ctx context.Context, invocation *invocation.Invocation) (_ any, err error) +} + +type integrationFunc func(code *codebase.Codebase) (Integration, error) + +var integrationsFuncs = map[string]integrationFunc{ + "Docker": DockerIntegration, +} + +func LoadIntegrations(code *codebase.Codebase) (Integrations, error) { + integrations := make(map[string]Integration) + + for name, integrationFct := range integrationsFuncs { + fmt.Println("trying to load integration", name) + + integration, err := integrationFct(code) + if err != nil { + return nil, fmt.Errorf("failed to load integration: %w", err) + } + + if integration.Exist() { + fmt.Println("integration", name, "exists in that project") + + integrations[name] = integration + } else { + fmt.Println("integration", name, "doesn't exist in that project") + } + } + + return integrations, nil +} diff --git a/magicsdk/magic_sdk/invocation/invocation.go b/magicsdk/magic_sdk/invocation/invocation.go new file mode 100644 index 0000000..99cad14 --- /dev/null +++ b/magicsdk/magic_sdk/invocation/invocation.go @@ -0,0 +1,8 @@ +package invocation + +type Invocation struct { + ParentJSON []byte + ParentName string + FnName string + InputArgs map[string][]byte +} \ No newline at end of file diff --git a/magicsdk/magic_sdk/main.go b/magicsdk/magic_sdk/main.go new file mode 100644 index 0000000..8d971e3 --- /dev/null +++ b/magicsdk/magic_sdk/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "context" + "fmt" + "os" + + "dagger.io/dagger/dag" + "dagger.io/magicsdk/module" +) + +func main() { + ctx := context.Background() + defer dag.Close() + + mod, err := module.Build("Test", "/app") + if err != nil { + panic(fmt.Errorf("failed to build module: %w", err)) + } + + if err := mod.Dispatch(ctx); err != nil { + os.Exit(2) + } +} \ No newline at end of file diff --git a/magicsdk/magic_sdk/module/module.go b/magicsdk/magic_sdk/module/module.go new file mode 100644 index 0000000..c6921ff --- /dev/null +++ b/magicsdk/magic_sdk/module/module.go @@ -0,0 +1,146 @@ +package module + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "dagger.io/dagger" + "dagger.io/dagger/dag" + "dagger.io/magicsdk/codebase" + "dagger.io/magicsdk/integration" + "dagger.io/magicsdk/invocation" + "github.com/vektah/gqlparser/v2/gqlerror" +) + +type Module struct { + name string + codebase *codebase.Codebase + integrations integration.Integrations +} + +func Build(name string, path string) (*Module, error) { + codebase, err := codebase.New(path) + if err != nil { + return nil, fmt.Errorf("failed to build module: %w", err) + } + + integrations, err := integration.LoadIntegrations(codebase) + if err != nil { + return nil, fmt.Errorf("failed to load integrations: %w", err) + } + + return &Module{ + name: name, + codebase: codebase, + integrations: integrations, + }, nil +} + +func (m *Module) TypeDef() *dagger.Module { + mod := dag.Module() + + mainObject := dag.TypeDef().WithObject(m.name) + for name, integration := range m.integrations { + mainObject = mainObject.WithFunction(dag.Function(name, dag.TypeDef().WithObject(name))) + + mod = mod.WithObject(integration.TypeDef()) + } + + mod = mod.WithObject(mainObject) + + return mod +} + +func unwrapError(rerr error) string { + var gqlErr *gqlerror.Error + if errors.As(rerr, &gqlErr) { + return gqlErr.Message + } + return rerr.Error() +} + +func (m *Module) Dispatch(ctx context.Context) (rerr error) { + fnCall := dag.CurrentFunctionCall() + defer func() { + if rerr != nil { + if err := fnCall.ReturnError(ctx, dag.Error(unwrapError(rerr))); err != nil { + fmt.Println("failed to return error:", err) + } + } + }() + + parentName, err := fnCall.ParentName(ctx) + if err != nil { + return fmt.Errorf("get parent name: %w", err) + } + fnName, err := fnCall.Name(ctx) + if err != nil { + return fmt.Errorf("get fn name: %w", err) + } + parentJson, err := fnCall.Parent(ctx) + if err != nil { + return fmt.Errorf("get fn parent: %w", err) + } + fnArgs, err := fnCall.InputArgs(ctx) + if err != nil { + return fmt.Errorf("get fn args: %w", err) + } + + inputArgs := map[string][]byte{} + for _, fnArg := range fnArgs { + argName, err := fnArg.Name(ctx) + if err != nil { + return fmt.Errorf("get fn arg name: %w", err) + } + argValue, err := fnArg.Value(ctx) + if err != nil { + return fmt.Errorf("get fn arg value: %w", err) + } + inputArgs[argName] = []byte(argValue) + } + + result, err := m.Invoke(ctx, &invocation.Invocation{ + ParentJSON: []byte(parentJson), + ParentName: parentName, + FnName: fnName, + InputArgs: inputArgs, + }) + if err != nil { + var exec *dagger.ExecError + if errors.As(err, &exec) { + return exec.Unwrap() + } + return err + } + + resultBytes, err := json.Marshal(result) + if err != nil { + return fmt.Errorf("marshal: %w", err) + } + + if err := fnCall.ReturnValue(ctx, dagger.JSON(resultBytes)); err != nil { + return fmt.Errorf("store return value: %w", err) + } + + return nil +} + +func (m *Module) Invoke(ctx context.Context, invocation *invocation.Invocation) (_ any, err error) { + switch invocation.ParentName { + case m.name: + switch invocation.FnName { + case "Docker": + return m.integrations["Docker"], nil + default: + return nil, fmt.Errorf("unknown function %s", invocation.FnName) + } + case "Docker": + return m.integrations["Docker"].Invoke(ctx, invocation) + case "": + return m.TypeDef(), nil + default: + return nil, fmt.Errorf("unknown object %s", invocation.ParentName) + } +} \ No newline at end of file diff --git a/magicsdk/main.go b/magicsdk/main.go new file mode 100644 index 0000000..1648038 --- /dev/null +++ b/magicsdk/main.go @@ -0,0 +1,43 @@ +package main + +import ( + "context" + "dagger/magicsdk/internal/dagger" +) + +type Magicsdk struct { + App *dagger.Directory + + RequiredPaths []string +} + +func New( + //+defaultPath="./magic_sdk" + app *dagger.Directory, +) *Magicsdk { + return &Magicsdk{ + App: app, + } +} + +func (m *Magicsdk) ModuleRuntime(ctx context.Context, modSource *dagger.ModuleSource, introspectionJSON *dagger.File) (*dagger.Container, error) { + runtimeBin := dag.Container(). + From("golang:1.23.2-alpine"). + WithDirectory("/src", m.App). + WithWorkdir("/src"). + WithExec([]string{"go", "build", "-o", "/src/magic_sdk", "."}). + File("/src/magic_sdk") + + return dag. + Container(). + From("golang:1.23.2-alpine"). + WithWorkdir("/runtime"). + WithFile("/runtime/magic_sdk", runtimeBin). + WithDirectory("/app", modSource.ContextDirectory()). + WithEntrypoint([]string{"/runtime/magic_sdk"}), nil +} + +// MagicSDK doesn't have any codegen logic +func (m *Magicsdk) Codegen(ctx context.Context, modSource *dagger.ModuleSource, introspectionJSON *dagger.File) (*dagger.GeneratedCode, error) { + return dag.GeneratedCode(dag.Directory()), nil +}