Skip to content

chore(backend): change From<T> impls to new backend specific IntoBackend and FromBackend traits #1464

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’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
Nov 3, 2024

Conversation

joshka
Copy link
Member

@joshka joshka commented Nov 2, 2024

Adds two traits IntoCrossterm and FromCrossterm for converting
between ratatui and crossterm types. This is necessary in order to avoid
the orphan rule when implementing From for crossterm types once the
crossterm types are moved to a separate crate.

Similarly Termwiz and Termwiz gain FromTermion, IntoTermion, FromTermwiz
and IntoTermwiz traits.

BREAKING CHANGE: The From and Into impls for backend types are now replaced
with specific backend traits.

+ use ratatui::backend::{FromCrossterm, IntoCrossterm};

let crossterm_color = crossterm::style::Color::Black;
- let ratatui_color = crossterm_color.into();
- let ratatui_color = ratatui::style::Color::from(crossterm_color);
+ let ratatui_color = ratatui::style::Color::from_crossterm(crossterm_color);
- let crossterm_color = ratatui_color.into();
- let crossterm_color = crossterm::style::Color::from(ratatui_color);
+ let crossterm_color = ratatui_color.into_crossterm();

let crossterm_attribute = crossterm::style::types::Attribute::Bold;
- let ratatui_modifier = crossterm_attribute.into();
- let ratatui_modifier = ratatui::style::Modifier::from(crossterm_attribute);
+ let ratatui_modifier = ratatui::style::Modifier::from_crossterm(crossterm_attribute);
- let crossterm_attribute = ratatui_modifier.into();
- let crossterm_attribute = crossterm::style::types::Attribute::from(ratatui_modifier);
+ let crossterm_attribute = ratatui_modifier.into_crossterm();

Similar conversions for ContentStyle -> Style and Attributes -> Modifier exist for Crossterm,
and all the Termion and Termwiz types.

@joshka joshka requested a review from a team as a code owner November 2, 2024 11:23
@joshka
Copy link
Member Author

joshka commented Nov 2, 2024

Follows up from #1460 (comment)

Copy link

codecov bot commented Nov 2, 2024

Codecov Report

Attention: Patch coverage is 84.88121% with 70 lines in your changes missing coverage. Please review.

Project coverage is 93.4%. Comparing base (fcde9cb) to head (25baa29).
Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
ratatui/src/backend/crossterm.rs 56.1% 46 Missing ⚠️
ratatui/src/backend/termwiz.rs 89.0% 24 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff           @@
##            main   #1464     +/-   ##
=======================================
- Coverage   93.5%   93.4%   -0.1%     
=======================================
  Files         68      68             
  Lines      16888   16875     -13     
=======================================
- Hits       15795   15778     -17     
- Misses      1093    1097      +4     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@joshka joshka force-pushed the jm/crossterm-conversion-methods branch 2 times, most recently from b5f6ba1 to f7ad9cc Compare November 2, 2024 11:29
@joshka
Copy link
Member Author

joshka commented Nov 2, 2024

Followup PRs commits for Termion and Termwiz to come

…term

Adds two new traits `IntoCrossterm` and `FromCrossterm` for converting
between ratatui and crossterm types. This is necessary in order to avoid
the orphan rule when implementing `From` for crossterm types once the
crossterm types are moved to a separate crate.

BREAKING CHANGE: The `From` impls for crossterm types are now replaced
with `IntoCrossterm` and `FromCrossterm` traits.

```diff
+ use ratatui::backend::{FromCrossterm, IntoCrossterm};

let crossterm_color = crossterm::style::Color::Black;
- let ratatui_color = crossterm_color.into();
- let ratatui_color = ratatui::style::Color::from(crossterm_color);
+ let ratatui_color = ratatui::style::Color::from_crossterm(crossterm_color);
- let crossterm_color = ratatui_color.into();
- let crossterm_color = crossterm::style::Color::from(ratatui_color);
+ let crossterm_color = ratatui_color.into_crossterm();

let crossterm_attribute = crossterm::style::types::Attribute::Bold;
- let ratatui_modifier = crossterm_attribute.into();
- let ratatui_modifier = ratatui::style::Modifier::from(crossterm_attribute);
+ let ratatui_modifier = ratatui::style::Modifier::from_crossterm(crossterm_attribute);
- let crossterm_attribute = ratatui_modifier.into();
- let crossterm_attribute = crossterm::style::types::Attribute::from(ratatui_modifier);
+ let crossterm_attribute = ratatui_modifier.into_crossterm();
```

Similar conversions for  `ContentStyle` -> `Style` and
`Attributes` -> `Modifier` exist.
@joshka joshka force-pushed the jm/crossterm-conversion-methods branch from f7ad9cc to 76499dc Compare November 2, 2024 11:39
Copy link
Contributor

github-actions bot commented Nov 2, 2024

🐰 Bencher Report

Branch1464/merge
Testbedubuntu-latest

⚠️ WARNING: The following Measure does not have a Threshold. Without a Threshold, no Alerts will ever be generated!

Click here to create a new Threshold
For more information, see the Threshold documentation.
To only post results if a Threshold exists, set the --ci-only-thresholds CLI flag.

Click to view all benchmark results
BenchmarkLatencynanoseconds (ns)
barchart/render/2048📈 view plot
⚠️ NO THRESHOLD
195,750.00
barchart/render/256📈 view plot
⚠️ NO THRESHOLD
128,580.00
barchart/render/64📈 view plot
⚠️ NO THRESHOLD
84,360.00
barchart/render_grouped/2048📈 view plot
⚠️ NO THRESHOLD
337,850.00
barchart/render_grouped/256📈 view plot
⚠️ NO THRESHOLD
139,020.00
barchart/render_grouped/64📈 view plot
⚠️ NO THRESHOLD
128,560.00
barchart/render_horizontal/2048📈 view plot
⚠️ NO THRESHOLD
164,880.00
barchart/render_horizontal/256📈 view plot
⚠️ NO THRESHOLD
83,970.00
barchart/render_horizontal/64📈 view plot
⚠️ NO THRESHOLD
77,252.00
block/render_all_feature/100x50📈 view plot
⚠️ NO THRESHOLD
11,204.00
block/render_all_feature/200x50📈 view plot
⚠️ NO THRESHOLD
19,606.00
block/render_all_feature/256x256📈 view plot
⚠️ NO THRESHOLD
93,520.00
block/render_empty/100x50📈 view plot
⚠️ NO THRESHOLD
6,119.60
block/render_empty/200x50📈 view plot
⚠️ NO THRESHOLD
12,106.00
block/render_empty/256x256📈 view plot
⚠️ NO THRESHOLD
79,263.00
buffer/empty/16📈 view plot
⚠️ NO THRESHOLD
826.96
buffer/empty/255📈 view plot
⚠️ NO THRESHOLD
226,120.00
buffer/empty/64📈 view plot
⚠️ NO THRESHOLD
13,370.00
buffer/filled/16📈 view plot
⚠️ NO THRESHOLD
775.53
buffer/filled/255📈 view plot
⚠️ NO THRESHOLD
222,840.00
buffer/filled/64📈 view plot
⚠️ NO THRESHOLD
13,093.00
buffer/with_lines/16📈 view plot
⚠️ NO THRESHOLD
14,240.00
buffer/with_lines/255📈 view plot
⚠️ NO THRESHOLD
15,155.00
buffer/with_lines/64📈 view plot
⚠️ NO THRESHOLD
14,448.00
line_render/Center/0📈 view plot
⚠️ NO THRESHOLD
4.01
line_render/Center/10📈 view plot
⚠️ NO THRESHOLD
629.31
line_render/Center/3📈 view plot
⚠️ NO THRESHOLD
299.26
line_render/Center/4📈 view plot
⚠️ NO THRESHOLD
340.64
line_render/Center/42📈 view plot
⚠️ NO THRESHOLD
844.67
line_render/Center/6📈 view plot
⚠️ NO THRESHOLD
399.49
line_render/Center/7📈 view plot
⚠️ NO THRESHOLD
456.66
line_render/Left/0📈 view plot
⚠️ NO THRESHOLD
4.02
line_render/Left/10📈 view plot
⚠️ NO THRESHOLD
590.87
line_render/Left/3📈 view plot
⚠️ NO THRESHOLD
227.83
line_render/Left/4📈 view plot
⚠️ NO THRESHOLD
242.87
line_render/Left/42📈 view plot
⚠️ NO THRESHOLD
839.19
line_render/Left/6📈 view plot
⚠️ NO THRESHOLD
385.32
line_render/Left/7📈 view plot
⚠️ NO THRESHOLD
398.91
line_render/Right/0📈 view plot
⚠️ NO THRESHOLD
4.01
line_render/Right/10📈 view plot
⚠️ NO THRESHOLD
566.74
line_render/Right/3📈 view plot
⚠️ NO THRESHOLD
277.26
line_render/Right/4📈 view plot
⚠️ NO THRESHOLD
331.97
line_render/Right/42📈 view plot
⚠️ NO THRESHOLD
842.80
line_render/Right/6📈 view plot
⚠️ NO THRESHOLD
440.23
line_render/Right/7📈 view plot
⚠️ NO THRESHOLD
496.33
list/render/16384📈 view plot
⚠️ NO THRESHOLD
1,198,200.00
list/render/2048📈 view plot
⚠️ NO THRESHOLD
320,060.00
list/render/64📈 view plot
⚠️ NO THRESHOLD
204,020.00
list/render_scroll_half/16384📈 view plot
⚠️ NO THRESHOLD
1,204,700.00
list/render_scroll_half/2048📈 view plot
⚠️ NO THRESHOLD
326,950.00
list/render_scroll_half/64📈 view plot
⚠️ NO THRESHOLD
137,190.00
paragraph/new/2048📈 view plot
⚠️ NO THRESHOLD
256,270.00
paragraph/new/64📈 view plot
⚠️ NO THRESHOLD
6,941.80
paragraph/new/65535📈 view plot
⚠️ NO THRESHOLD
8,158,400.00
paragraph/render/2048📈 view plot
⚠️ NO THRESHOLD
604,700.00
paragraph/render/64📈 view plot
⚠️ NO THRESHOLD
566,130.00
paragraph/render/65535📈 view plot
⚠️ NO THRESHOLD
1,503,800.00
paragraph/render_scroll_full/2048📈 view plot
⚠️ NO THRESHOLD
583,770.00
paragraph/render_scroll_full/64📈 view plot
⚠️ NO THRESHOLD
614,170.00
paragraph/render_scroll_full/65535📈 view plot
⚠️ NO THRESHOLD
1,477,300.00
paragraph/render_scroll_half/2048📈 view plot
⚠️ NO THRESHOLD
581,540.00
paragraph/render_scroll_half/64📈 view plot
⚠️ NO THRESHOLD
614,200.00
paragraph/render_scroll_half/65535📈 view plot
⚠️ NO THRESHOLD
1,472,900.00
paragraph/render_wrap/2048📈 view plot
⚠️ NO THRESHOLD
295,140.00
paragraph/render_wrap/64📈 view plot
⚠️ NO THRESHOLD
255,640.00
paragraph/render_wrap/65535📈 view plot
⚠️ NO THRESHOLD
1,453,600.00
paragraph/render_wrap_scroll_full/2048📈 view plot
⚠️ NO THRESHOLD
295,570.00
paragraph/render_wrap_scroll_full/64📈 view plot
⚠️ NO THRESHOLD
257,130.00
paragraph/render_wrap_scroll_full/65535📈 view plot
⚠️ NO THRESHOLD
1,477,900.00
rect/rect_columns_collect/16📈 view plot
⚠️ NO THRESHOLD
39.41
rect/rect_columns_collect/255📈 view plot
⚠️ NO THRESHOLD
290.88
rect/rect_columns_collect/64📈 view plot
⚠️ NO THRESHOLD
85.80
rect/rect_columns_iter/16📈 view plot
⚠️ NO THRESHOLD
10.64
rect/rect_columns_iter/255📈 view plot
⚠️ NO THRESHOLD
84.09
rect/rect_columns_iter/64📈 view plot
⚠️ NO THRESHOLD
26.11
rect/rect_positions_collect/16x16📈 view plot
⚠️ NO THRESHOLD
292.70
rect/rect_positions_collect/255x255📈 view plot
⚠️ NO THRESHOLD
60,669.00
rect/rect_positions_collect/64x64📈 view plot
⚠️ NO THRESHOLD
3,867.60
rect/rect_positions_iter/16x16📈 view plot
⚠️ NO THRESHOLD
247.75
rect/rect_positions_iter/255x255📈 view plot
⚠️ NO THRESHOLD
60,130.00
rect/rect_positions_iter/64x64📈 view plot
⚠️ NO THRESHOLD
3,799.90
rect/rect_rows_collect/16📈 view plot
⚠️ NO THRESHOLD
37.25
rect/rect_rows_collect/255📈 view plot
⚠️ NO THRESHOLD
259.10
rect/rect_rows_collect/64📈 view plot
⚠️ NO THRESHOLD
82.43
rect/rect_rows_iter/16📈 view plot
⚠️ NO THRESHOLD
7.72
rect/rect_rows_iter/255📈 view plot
⚠️ NO THRESHOLD
80.24
rect/rect_rows_iter/64📈 view plot
⚠️ NO THRESHOLD
21.37
sparkline/render/2048📈 view plot
⚠️ NO THRESHOLD
124,870.00
sparkline/render/256📈 view plot
⚠️ NO THRESHOLD
122,890.00
sparkline/render/64📈 view plot
⚠️ NO THRESHOLD
39,057.00
table/render/16384x2📈 view plot
⚠️ NO THRESHOLD
2,842,800.00
table/render/16384x4📈 view plot
⚠️ NO THRESHOLD
5,276,900.00
table/render/16384x8📈 view plot
⚠️ NO THRESHOLD
14,470,000.00
table/render/2048x2📈 view plot
⚠️ NO THRESHOLD
623,130.00
table/render/2048x4📈 view plot
⚠️ NO THRESHOLD
1,075,200.00
table/render/2048x8📈 view plot
⚠️ NO THRESHOLD
1,764,900.00
table/render/64x2📈 view plot
⚠️ NO THRESHOLD
318,850.00
table/render/64x4📈 view plot
⚠️ NO THRESHOLD
493,530.00
table/render/64x8📈 view plot
⚠️ NO THRESHOLD
571,040.00
table/render_scroll_half/16384x2📈 view plot
⚠️ NO THRESHOLD
2,833,800.00
table/render_scroll_half/16384x4📈 view plot
⚠️ NO THRESHOLD
5,480,700.00
table/render_scroll_half/16384x8📈 view plot
⚠️ NO THRESHOLD
15,395,000.00
table/render_scroll_half/2048x2📈 view plot
⚠️ NO THRESHOLD
636,370.00
table/render_scroll_half/2048x4📈 view plot
⚠️ NO THRESHOLD
1,097,500.00
table/render_scroll_half/2048x8📈 view plot
⚠️ NO THRESHOLD
1,761,300.00
table/render_scroll_half/64x2📈 view plot
⚠️ NO THRESHOLD
208,090.00
table/render_scroll_half/64x4📈 view plot
⚠️ NO THRESHOLD
335,890.00
table/render_scroll_half/64x8📈 view plot
⚠️ NO THRESHOLD
382,000.00
🐰 View full continuous benchmarking report in Bencher

@joshka joshka changed the title chore(crossterm): change From<T> impls to IntoCrossterm and FromCrossterm chore(backend): change From<T> impls to new backend specific IntoBackend and FromBackend traits Nov 2, 2024
@joshka joshka marked this pull request as draft November 2, 2024 12:02
@joshka joshka force-pushed the jm/crossterm-conversion-methods branch from 81d5adf to cd66b2f Compare November 2, 2024 12:11
@joshka joshka marked this pull request as ready for review November 2, 2024 12:11
Copy link
Member

@orhun orhun left a comment

Choose a reason for hiding this comment

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

Nice trick, I'm wondering if there are any other libraries doing something similar? How did you get inspired? :D

joshka and others added 3 commits November 3, 2024 13:27
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
Co-authored-by: Orhun Parmaksız <orhun@archlinux.org>
@joshka
Copy link
Member Author

joshka commented Nov 3, 2024

Nice trick, I'm wondering if there are any other libraries doing something similar? How did you get inspired? :D

Axum has:

This should mostly be unused as there's unlikely be a lot of crates that convert backend types to / from ratatui types, but for those that need it, it makes sense not to repeat the code.

@joshka joshka merged commit abe2f27 into main Nov 3, 2024
31 of 32 checks passed
@joshka joshka deleted the jm/crossterm-conversion-methods branch November 3, 2024 21:43
This was referenced Feb 11, 2025
This was referenced Mar 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants