Comments (7)
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:
- Read the command-line and use the specified value, if present, returning
Option.some(value)
- If not, try reading from the environment and use that value, if present, returning
Option.some(value)
- 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.
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.
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.
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.
@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.
@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.
Great answer! solves my questions.
from effect.
Related Issues (20)
- Expose internals used in JSONSchema so we can write our own interpreters
- From Discord: Help Needed with HttpApp Middleware and Type Errors HOT 1
- From Discord: Handling Errors in Layer Instantiation and Bootstrapping in Complex Apps
- From Discord: Unexpected Behavior in HTTP Middleware: Unhandled Errors Cause Request Hang HOT 3
- Prompt.file filter does not provide enough context to filter files
- From Discord: Bug Report: Incorrect Type Inference with `Effect.repeat`
- Using Bun with @effect/vitest, tests fail to run HOT 1
- `Stream.zip` for more than two streams HOT 2
- Support binary values in KeyValueStore
- `Array.gen` expressions as in `Option.gen` or `Either.gen` HOT 1
- Separate and export the return types of function definitions HOT 3
- From Discord: Different Return Types in Curried vs Non-Curried `attachPropertySignature` in TypeScript
- Config: Expected VALUE to exist in the process context HOT 3
- From Discord: make json schema output more compatible with Open AI structured output
- Dynamic Scope access causes a memory leak
- Passing a default value to `Prompt.text` from @effect/cli has no effect. HOT 4
- Dual overload signature problem HOT 4
- IndexedDB support in browser platform package
- From Discord: Proposed Do Notation Syntax: `bindAll` with Unbounded Concurrency
- Problem fetching data using the "@effect/platform" library HOT 9
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from effect.