diff --git a/cmd/lambda/lambda_convert.go b/cmd/lambda/lambda_convert.go index a8ff217..b2fd20c 100644 --- a/cmd/lambda/lambda_convert.go +++ b/cmd/lambda/lambda_convert.go @@ -25,11 +25,14 @@ func LambdaConvert() *cobra.Command { var inputReprFlag, outputReprFlag string cmd := &cobra.Command{ - Use: "convert ", + Use: "convert ", Short: "Convert between lambda calculus representations", - Args: cobra.ExactArgs(2), SilenceUsage: true, - RunE: func(_ *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) != 2 { + return cmd.Help() + } + var err error inputPath, outputPath := args[0], args[1] @@ -71,7 +74,7 @@ func LambdaConvert() *cobra.Command { // Marshal output. output, err := r.Marshal(result) if err != nil { - return fmt.Errorf("marshaling output: %w", err) + return fmt.Errorf("unmarshaling output: %w", err) } // Write output file. diff --git a/internal/cli/conversion.go b/internal/cli/conversion.go index 5fb0db1..d198f8e 100644 --- a/internal/cli/conversion.go +++ b/internal/cli/conversion.go @@ -21,7 +21,7 @@ type forwardCodec[T, U any] struct { func (c forwardCodec[T, U]) Run(r Repr) (Repr, error) { t, ok := r.Data().(T) if !ok { - return nil, fmt.Errorf("could not parse '%v' as '%s'", t, c.outType) + return nil, fmt.Errorf("could not parse '%v' as '%s'", t, c.inType) } u, err := c.codec.Encode(t) @@ -29,7 +29,7 @@ func (c forwardCodec[T, U]) Run(r Repr) (Repr, error) { return nil, err } - return NewRepr(c.inType, u), nil + return NewRepr(c.outType, u), nil } func (c forwardCodec[T, U]) InType() string { return c.inType } @@ -44,7 +44,7 @@ type backwardCodec[T, U any] struct { func (c backwardCodec[T, U]) Run(r Repr) (Repr, error) { u, ok := r.Data().(U) if !ok { - return nil, fmt.Errorf("could not parse '%v' as '%s'", r, c.inType) + return nil, fmt.Errorf("could not parse '%v' as '%s'", r, c.outType) } t, err := c.codec.Decode(u) @@ -52,7 +52,7 @@ func (c backwardCodec[T, U]) Run(r Repr) (Repr, error) { return nil, err } - return NewRepr(c.outType, t), nil + return NewRepr(c.inType, t), nil } func (c backwardCodec[T, U]) InType() string { return c.outType } diff --git a/internal/cli/marshaler.go b/internal/cli/marshaler.go index e10f7ee..a212417 100644 --- a/internal/cli/marshaler.go +++ b/internal/cli/marshaler.go @@ -2,6 +2,7 @@ package cli import ( "fmt" + "reflect" "git.maximhutz.com/max/lambda/pkg/codec" ) @@ -29,7 +30,9 @@ func (c convertedMarshaler[T]) Decode(s string) (Repr, error) { func (c convertedMarshaler[T]) Encode(r Repr) (string, error) { t, ok := r.Data().(T) if !ok { - return "", fmt.Errorf("could not parse '%v' as 'string'", t) + dataType := reflect.TypeOf(r.Data()) + allowedType := reflect.TypeFor[T]() + return "", fmt.Errorf("marshaler for '%s' cannot parse '%s'", allowedType, dataType) } return c.codec.Encode(t)