# Best Strategy for throwing/returning from an assignment switch/

**URL:** <https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577>\
**Category:** Language Support\
**Tags:** Motoko\
**Created:** [June 29, 2021, 4:13pm UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577 "2021-06-29T16:13:33Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![skilesare](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/skilesare/32/5609_2.png) [@skilesare](https://forum.dfinity.org/u/skilesare)\
**Post date:** [June 29, 2021, 4:13pm UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/1 "2021-06-29T16:13:33Z")

</div>

What is the best way to throw or return from an assignment switch? I want to do something like:

```
   func pick(request : MyRequest) : Result<MyVariant, Text>{
             let config = switch(request.config){
                    case(#variant1(data)){#internal;};
                    case(#variant2(pullRequest)){#internal2}; };
                    case(#badVariant){return #err("Never should be here"}; // won't compile due to a type error
                    // or case(#badVariant){throw #err("Never should be here"}; but returns an Error type and doesnt work
                };
         return #ok(config);
     }
```

---

<div class="post-metadata">

**Author:** ![paulyoung](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/paulyoung/32/5251_2.png) [@paulyoung](https://forum.dfinity.org/u/paulyoung)\
**Post date:** [June 30, 2021, 2:01am UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/2 "2021-06-30T02:01:55Z")

</div>

I would skip the assignment and instead return `#ok(…)` inside of the case:

```auto
func pick(request : MyRequest) : Result<MyVariant, Text> {
  switch(request.config) {
    case(#variant1(data)) { #ok(#internal); };
    case(#variant2(pullRequest)) { #ok(#internal2); };
    case(#badVariant) { #err("Never should be here"; };
  };
};

```

---

<div class="post-metadata">

**Author:** ![skilesare](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/skilesare/32/5609_2.png) [@skilesare](https://forum.dfinity.org/u/skilesare)\
**Post date:** [June 30, 2021, 3:40am UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/3 "2021-06-30T03:40:20Z")

</div>

That is a good strategy if I’m ready to return…and my example was perhaps a bit simplistic. In the real world I’m setting up this variant to go into a function call further down in the function, so I can’t return right away in every scenario.

---

<div class="post-metadata">

**Author:** ![paulyoung](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/paulyoung/32/5251_2.png) [@paulyoung](https://forum.dfinity.org/u/paulyoung)\
**Post date:** [June 30, 2021, 3:43am UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/4 "2021-06-30T03:43:58Z")

</div>

In that case I would keep what I did but create a `let` binding for the result and then use `map`.

In languages with special syntax like `do` notation or Rust’s `?` you can use that instead.

---

<div class="post-metadata">

**Author:** ![rossberg](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/rossberg/32/795_2.png) [@rossberg](https://forum.dfinity.org/u/rossberg)\
**Post date:** [June 30, 2021, 1:37pm UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/5 "2021-06-30T13:37:30Z")

</div>

If you don’t need the Result type immediately, then you can use `do?`.

```auto
func pick(request : MyRequest) : Result<MyVariant, Text>{
   let result = do? {
     let config = switch (request.config) {
        case (#variant1(data)) { #internal };
        case (#variant2(pullRequest)) { #internal2 };
        case (#badVariant) { null! };
     };
     // ...do something with config
     // ...produce result
  };
  return Result.fromOption(result, "error message");
}

```

At some point, we’d like to generalise `do?` to enable producing something like Result directly, but that’s not there yet.

---

<div class="post-metadata">

**Author:** ![skilesare](https://sea1.discourse-cdn.com/flex023/user_avatar/forum.dfinity.org/skilesare/32/5609_2.png) [@skilesare](https://forum.dfinity.org/u/skilesare)\
**Post date:** [June 30, 2021, 2:42pm UTC](https://forum.dfinity.org/t/best-strategy-for-throwing-returning-from-an-assignment-switch/5577/6 "2021-06-30T14:42:01Z")

</div>

.fromOption! Perfect. I need to re read the Base Libraries now that I actually know motoko. 😂
