# README
The deriveCompose function composes multiple functions that return an error into one function.
Given the following input:
package compose
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strings"
)
func upgradeUser(endpoint, username string) error {
getEndpoint := fmt.Sprintf("%s/oldusers/%s", endpoint, username)
postEndpoint := fmt.Sprintf("%s/newusers/%s", endpoint, username)
_, err := deriveCompose(
http.Get,
func(resp *http.Response) ([]byte, error) {
return ioutil.ReadAll(resp.Body)
},
newUserFromJson,
newUserFromUser,
json.Marshal,
func(buf []byte) (*http.Response, error) {
return http.Post(
postEndpoint,
"application/json",
bytes.NewBuffer(buf),
)
},
)(getEndpoint)
return err
}
type user struct {
Name string
}
func newUserFromJson(buf []byte) (*user, error) {
u := &user{}
return u, json.Unmarshal(buf, u)
}
type newUser struct {
Name string
LastNames string
}
func newUserFromUser(u *user) (*newUser, error) {
names := strings.Split(u.Name, " ")
n := &newUser{Name: names[0]}
if len(names) <= 1 {
return nil, fmt.Errorf("user has no last name")
}
n.LastNames = strings.Join(names[1:], " ")
return n, nil
}
goderive will generate the following code:
// Code generated by goderive DO NOT EDIT.
package compose
import (
http "net/http"
)
// deriveCompose composes functions f0, f1, f2, f3, f4 and f5 into one function, that takes the parameters from f0 and returns the results from f5.
func deriveCompose(f0 func(string) (*http.Response, error), f1 func(*http.Response) ([]byte, error), f2 func([]byte) (*user, error), f3 func(*user) (*newUser, error), f4 func(any) ([]byte, error), f5 func([]byte) (*http.Response, error)) func(string) (*http.Response, error) {
return func(v_0_0 string) (*http.Response, error) {
v_1_0, err0 := f0(v_0_0)
if err0 != nil {
return nil, err0
}
v_2_0, err1 := f1(v_1_0)
if err1 != nil {
return nil, err1
}
v_3_0, err2 := f2(v_2_0)
if err2 != nil {
return nil, err2
}
v_4_0, err3 := f3(v_3_0)
if err3 != nil {
return nil, err3
}
v_5_0, err4 := f4(v_4_0)
if err4 != nil {
return nil, err4
}
v_6_0, err5 := f5(v_5_0)
if err5 != nil {
return nil, err5
}
return v_6_0, nil
}
}