Skip to content

Instantly share code, notes, and snippets.

@ansiwen
Last active October 17, 2023 23:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ansiwen/67b677c07a343a0b0e3df8cdee232bcb to your computer and use it in GitHub Desktop.
Save ansiwen/67b677c07a343a0b0e3df8cdee232bcb to your computer and use it in GitHub Desktop.
Short-Circuit-Error-API

Original

func myFunc() (string, error) {
	file, err := os.Open("data.json")
	if err != nil {
		return "", fmt.Errorf("open data.json: %w", err)
	}

	jsonData, err := io.ReadAll(file)
	if err != nil {
		return "", err
	}

	var myData map[string]any
	json.Unmarshal(jsonData, &myData)
	if err != nil {
		return "", fmt.Errorf("unmarshalling: %w", err)
	}

	val, ok := myData["name"]
	if !ok {
		return "", fmt.Errorf("missing name property")
	}

	name, ok := val.(string)
	if !ok {
		return "", fmt.Errorf("invalid name property")
	}

	return name, nil
}

Option 1

func myFunc() (name string, err error) {
	defer sce.PassTo(&err)

	file := sce.Try1(os.Open("data.json")).Unwrap("open data.json")

	jsonData := sce.Must1(io.ReadAll(file))

	var myData map[string]any
	sce.Check(json.Unmarshal(jsonData, &myData), "unmarshalling")

	val, ok := myData["name"]
	sce.Assert(ok, "missing name property")

	name, ok = val.(string)
	sce.Assert(ok, "invalid name property")

	return
}

Option 2

func myFunc() (name string, err error) {
	defer sce.PassTo(&err)

	file := sce.Try1(os.Open("data.json"))("open data.json")

	jsonData := sce.Try1(io.ReadAll(file))()

	var myData map[string]any
	sce.Check(json.Unmarshal(jsonData, &myData), "unmarshalling")

	val, ok := myData["name"]
	sce.Assert(ok, "missing name property")

	name, ok = val.(string)
	sce.Assert(ok, "invalid name property")

	return
}

Option 3

func myFunc() (name string, err error) {
	defer sce.PassTo(&err)

	file := sce.T1(os.Open("data.json")).Uw("open data.json")

	jsonData := sce.M1(io.ReadAll(file))

	var myData map[string]any
	sce.C(json.Unmarshal(jsonData, &myData), "unmarshalling")

	val, ok := myData["name"]
	sce.A(ok, "missing name property")

	name, ok = val.(string)
	sce.A(ok, "invalid name property")

	return
}

Option 4

func myFunc() (name string, err error) {
	defer shoterr.PassTo(&err)

	file := shorterr.Do(os.Open("data.json")).Or("open data.json")

	jsonData := shorterr.Do(io.ReadAll(file)).Or()

	var myData map[string]any
	shorterr.Check(json.Unmarshal(jsonData, &myData), "unmarshalling")

	val, ok := myData["name"]
	shorterr.Assert(ok, "missing name property")

	name, ok = val.(string)
	shorterr.Assert(ok, "invalid name property")

	return
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment