Code Monkey home page Code Monkey logo

Comments (7)

IMax153 avatar IMax153 commented on September 23, 2024 1

Hey @joepjoosten - I think I'm understanding a bit better now.

First of all, let me clear up that Options is not analagous to a ConfigProvider whatsoever.

Options uses the ConfigProvider to allow the CLI program to fall back to the specified Config value when the command-line flag is not provided. So in a situation where optionA is not provided by the user, it can fall back to the specified Config value, which will be read using whichever ConfigProvider is provided to the program. The default ConfigProvider reads from the environment, so if no ConfigProvider is provided by you in your CLI program the default behavior will be to fall back to the value in the environment (if present).

Also, looking at your sample above, I would adjust the code as follows:

Options.text("optionA").pipe(
  Options.withDescription('Option A.'), 
  Options.withFallbackConfig(Config.string("OPTION_A")),
  Options.optional
)

which moves the Options.optional to the end of the pipeline and removes the Config.option.

This will result in the following behavior when the optionA command-line option attempts to be parsed:

  1. Read the command-line and use the specified value, if present, returning Option.some(value)
  2. If not, try reading from the environment and use that value, if present, returning Option.some(value)
  3. If not, return Option.none

The way you wrote optionA previously, you would never attempt to use the fallback config value since Options.optional would just return Option.none if the command-line value wasn't there.

from effect.

IMax153 avatar IMax153 commented on September 23, 2024 1

Also, regarding parsing a duration from the command line, you could just do:

import * as Options from "@effect/cli/Options"
import * as Duration from "effect/Duration"
import * as Option from "effect/Option"

const myOption = Options.text("optionA").pipe(
  Options.withDescription('Option A.'), 
  Options.withFallbackConfig(Config.string("OPTION_A")),
  Options.optional,
  Options.map(Option.flatMap(Duration.decodeUnknown))
)

Note: I did not test this code in an editor, you might need to adjust slightly.

from effect.

joepjoosten avatar joepjoosten commented on September 23, 2024

A more general question: Options in effect/cli is "closely" related to Config in effect, in other words: is a subset / intersection of the Config methods? Is it possible to reuse this subset / intersection?

from effect.

mikearnaldi avatar mikearnaldi commented on September 23, 2024

They don't look related imho, Config is a description of a configuration to be read from a ConfigProvider, Options in CLI represent options that the user can pass through cli flags, maybe @IMax153 can shed some further light

from effect.

IMax153 avatar IMax153 commented on September 23, 2024

@joepjoosten - as @mikearnaldi mentioned, I'm not seeing the parallel between Config and Options. They are two totally separate data types used for different purposes.

Are you looking for a way to parse a duration input from the command line?

from effect.

joepjoosten avatar joepjoosten commented on September 23, 2024

@mikearnaldi @IMax153 Good point.

What i noticed when i was writing Options for my CLI the following way:

Options.text("optionA").pipe(
  Options.optional, 
  Options.withDescription('Option A.'), 
  Options.withFallbackConfig(
    Config.string("OPTION_A").pipe(Config.option)
  )
)

That's why it seemed related (in one direction: Config -> Options)

I saw the "inconsistancy" between e.g. Options.optional <=> Config.option, and that Options is lacking the recently added Config.duration.

Maybe the Options are a ConfigProvider in a way?

from effect.

joepjoosten avatar joepjoosten commented on September 23, 2024

Great answer! solves my questions.

from effect.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.