diff --git a/cmd/contract.go b/cmd/contract.go index 341a6523..61f72c03 100644 --- a/cmd/contract.go +++ b/cmd/contract.go @@ -121,6 +121,31 @@ func decodeCalldataFunc(conn decodeCalldataer, args []string) (err error) { return } +var generateAciCmd = &cobra.Command{ + Use: "generateaci FILENAME", + Short: "Generate ACI out of source code", + Long: ``, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + compiler := newCompiler() + return generateAciFunc(compiler, args) + }, + SilenceUsage: true, +} + +func generateAciFunc(conn aeternity.GenerateACIer, args []string) (err error) { + source, err := readSource(args[0]) + if err != nil { + return + } + + aci, err := conn.GenerateACI(source) + if err != nil { + return + } + PrintObject("ACI", aci) + return nil +} func readSource(path string) (s string, err error) { file, err := os.Open(path) if err != nil { diff --git a/cmd/contract_test.go b/cmd/contract_test.go index 8f51363b..eb9aae84 100644 --- a/cmd/contract_test.go +++ b/cmd/contract_test.go @@ -179,3 +179,36 @@ func Test_decodeCalldataFunc(t *testing.T) { }) } } + +func Test_generateAciFunc(t *testing.T) { + // Write source file for Decode with source file test + tempdir, path := writeTestContractFile(t, contractSimpleStorage) + defer os.RemoveAll(tempdir) + type args struct { + conn aeternity.GenerateACIer + args []string + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "Generate ACI from SimpleStorage", + args: args{ + conn: &mockGenerateACIer{ + aci: `{"encoded_aci":{"contract":{"functions":[{"arguments":[{"name":"value","type":"int"}],"name":"init","returns":"SimpleStorage.state","stateful":false}],"name":"SimpleStorage","state":{"record":[{"name":"data","type":"int"}]},"type_defs":[]}},"interface":"contract SimpleStorage =\n record state = {data : int}\n entrypoint init : (int) =\u003e SimpleStorage.state\n"}`, + }, + args: []string{path}, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := generateAciFunc(tt.args.conn, tt.args.args); (err != nil) != tt.wantErr { + t.Errorf("generateAciFunc() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/cmd/mocks_test.go b/cmd/mocks_test.go index 396c3bdb..d33c45f7 100644 --- a/cmd/mocks_test.go +++ b/cmd/mocks_test.go @@ -145,3 +145,13 @@ func (m *mockdecodeCalldataer) DecodeCalldataBytecode(bytecode string, calldata decodedCallData.UnmarshalBinary([]byte(m.decodedCalldata)) return decodedCallData, nil } + +type mockGenerateACIer struct { + aci string +} + +func (m *mockGenerateACIer) GenerateACI(source string) (aci *compilermodels.ACI, err error) { + aci = &compilermodels.ACI{} + err = aci.UnmarshalBinary([]byte(m.aci)) + return aci, err +}