๐Ÿ“ฆ sleepyfran / duets

๐Ÿ“„ FireMember.Command.fs ยท 64 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64namespace Duets.Cli.Components.Commands

open Duets.Agents
open Duets.Cli.Components
open Duets.Cli.SceneIndex
open Duets.Cli.Text
open Duets.Common
open Duets.Entities
open Duets.Simulation
open Duets.Simulation.Bands.Members

[<RequireQualifiedAccess>]
module FireMemberCommand =
    let private textFromMember (bandMember: CurrentMember) =
        let character =
            Queries.Characters.find (State.get ()) bandMember.CharacterId

        Rehearsal.fireMemberListItem (character.Name, bandMember.Role)

    let rec private promptForMember bandMembers =
        let selectedMember =
            showOptionalChoicePrompt
                Rehearsal.fireMemberPrompt
                Generic.cancel
                textFromMember
                bandMembers

        match selectedMember with
        | Some bandMember -> promptForConfirmFiring bandMember
        | None -> ()

    and private promptForConfirmFiring bandMember =
        let character =
            Queries.Characters.find (State.get ()) bandMember.CharacterId

        let confirmed =
            showConfirmationPrompt (
                Rehearsal.fireMemberConfirmation character.Name
            )

        if confirmed then
            let state = State.get ()

            let currentBand = Queries.Bands.currentBand state

            fireMember state currentBand bandMember
            |> Result.unwrap
            |> Duets.Cli.Effect.apply
        else
            ()

    /// Command fire a member of the band.
    let create bandMembers =
        { Name = "fire member"
          Description = Command.fireMemberDescription
          Handler =
            (fun _ ->
                if List.isEmpty bandMembers then
                    Rehearsal.fireMemberNoMembersToFire |> showMessage
                else
                    promptForMember bandMembers

                Scene.World) }