Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Split the plugin crate #12563

Merged
merged 17 commits into from
Apr 27, 2024
Merged

Split the plugin crate #12563

merged 17 commits into from
Apr 27, 2024

Conversation

devyn
Copy link
Contributor

@devyn devyn commented Apr 18, 2024

Description

This breaks nu-plugin up into four crates:

  • nu-plugin-protocol: just the type definitions for the protocol, no I/O. If someone wanted to wire up something more bare metal, maybe for async I/O, they could use this.
  • nu-plugin-core: the shared stuff between engine/plugin. Less stable interface.
  • nu-plugin-engine: everything required for the engine to talk to plugins. Less stable interface.
  • nu-plugin: everything required for the plugin to talk to the engine, what plugin developers use. Should be the most stable interface.

No changes are made to the interface exposed by nu-plugin - it should all still be there. Re-exports from nu-plugin-protocol or nu-plugin-core are used as required. Plugins shouldn't ever have to use those crates directly.

This should be somewhat faster to compile as nu-plugin-engine and nu-plugin can compile in parallel, and the engine doesn't need nu-plugin and plugins don't need nu-plugin-engine (except for test support), so that should reduce what needs to be compiled too.

The only significant change here other than splitting stuff up was to break the source out of PluginCustomValue and create a new PluginCustomValueWithSource type that contains that instead. One bonus of that is we get rid of the option and it's now more type-safe, but it also means that the logic for that stuff (actually running the plugin for custom value ops) can live entirely within the nu-plugin-engine crate.

User-Facing Changes

  • New crates.
  • Added local-socket feature for nu to try to make it possible to compile without that support if needed.

Tests + Formatting

  • 馃煝 toolkit fmt
  • 馃煝 toolkit clippy
  • 馃煝 toolkit test
  • 馃煝 toolkit test stdlib

Copy link
Member

@sholderbach sholderbach left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was quick and seemingly relatively painless.

Not quite sure if we need the nu-plugin-protocol / nu-plugin-core split yet but there is probably not much harm.

Is there a specificly raised need to remove the socket support, otherwise I am inclined to say that added feature causes complexity for testing and ensuring compatibility between nu and plugin builds.

crates/nu_plugin_stress_internals/src/main.rs Outdated Show resolved Hide resolved
Cargo.toml Outdated Show resolved Hide resolved
@fdncred fdncred added the pr:plugins This PR is related to plugins label Apr 20, 2024
@sholderbach
Copy link
Member

With your recent polishing here, are we good to go to land this and prep the release script?

@devyn
Copy link
Contributor Author

devyn commented Apr 21, 2024

I think I'd probably like to see #12607 merge too first, then I can fix all of the conflicts from all of that effort

@devyn
Copy link
Contributor Author

devyn commented Apr 24, 2024

It's ok for now, but will probably conflict with some of the other PRs

@sholderbach
Copy link
Member

And the guaranteed conflicts came 馃槅

@fdncred fdncred merged commit 0c4d533 into nushell:main Apr 27, 2024
16 checks passed
@hustcer hustcer added this to the v0.93.0 milestone Apr 28, 2024
maxim-uvarov pushed a commit to maxim-uvarov/nushell that referenced this pull request May 1, 2024
# Description

This breaks `nu-plugin` up into four crates:

- `nu-plugin-protocol`: just the type definitions for the protocol, no
I/O. If someone wanted to wire up something more bare metal, maybe for
async I/O, they could use this.
- `nu-plugin-core`: the shared stuff between engine/plugin. Less stable
interface.
- `nu-plugin-engine`: everything required for the engine to talk to
plugins. Less stable interface.
- `nu-plugin`: everything required for the plugin to talk to the engine,
what plugin developers use. Should be the most stable interface.

No changes are made to the interface exposed by `nu-plugin` - it should
all still be there. Re-exports from `nu-plugin-protocol` or
`nu-plugin-core` are used as required. Plugins shouldn't ever have to
use those crates directly.

This should be somewhat faster to compile as `nu-plugin-engine` and
`nu-plugin` can compile in parallel, and the engine doesn't need
`nu-plugin` and plugins don't need `nu-plugin-engine` (except for test
support), so that should reduce what needs to be compiled too.

The only significant change here other than splitting stuff up was to
break the `source` out of `PluginCustomValue` and create a new
`PluginCustomValueWithSource` type that contains that instead. One bonus
of that is we get rid of the option and it's now more type-safe, but it
also means that the logic for that stuff (actually running the plugin
for custom value ops) can live entirely within the `nu-plugin-engine`
crate.

# User-Facing Changes
- New crates.
- Added `local-socket` feature for `nu` to try to make it possible to
compile without that support if needed.

# Tests + Formatting
- 馃煝 `toolkit fmt`
- 馃煝 `toolkit clippy`
- 馃煝 `toolkit test`
- 馃煝 `toolkit test stdlib`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
pr:plugins This PR is related to plugins
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants