Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Use &mut self in invoice updaters, not take-self-return-Self by TheBlueMatt · Pull Request #1331 · lightningdevkit/rust-lightning · GitHub
Skip to content

Use &mut self in invoice updaters, not take-self-return-Self - #1331

Merged
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields
Mar 11, 2022
Merged

Use &mut self in invoice updaters, not take-self-return-Self#1331
jkczyz merged 1 commit into
lightningdevkit:mainfrom
TheBlueMatt:2022-02-no-copy-invoice-fields

Conversation

@TheBlueMatt

Copy link
Copy Markdown
Collaborator

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.

See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.

There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.

The take-self-return-Self idiom in Rust is substantially less
usable than it is in Java, where its more common. Because we have
to take self by move, it prevents using the update methods to
actually update features, something we occasionally want to do.
See, eg, the change in lightning-invoice where we previously had
to copy and re-create an entire vec of fields just to update the
features field, which is nuts.
There are a few places where this makes things a little less clean,
but the tradeoff to enable more effecient and broader uses of the
update methods seems worth it.
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

Merging #1331 (b7d57ea) into main (e43cfe1) will increase coverage by 0.10%.
The diff coverage is 100.00%.

Impacted file tree graph

@@ Coverage Diff @@## main #1331 +/- ##
==========================================
+ Coverage 90.52% 90.62% +0.10% 
==========================================
Files 72 72 Lines 39618 40370 +752 ==========================================
+ Hits 35864 36587 +723 - Misses 3754 3783 +29 
Impacted FilesCoverage Δ
lightning-invoice/src/lib.rs88.24% <100.00%> (-0.02%)⬇️
lightning/src/ln/features.rs98.30% <100.00%> (+0.02%)⬆️
lightning/src/routing/router.rs93.07% <100.00%> (+1.15%)⬆️
lightning/src/ln/functional_tests.rs97.06% <0.00%> (-0.07%)⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update e43cfe1...b7d57ea. Read the comment docs.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Could we still support the chained-notation by taking a &mut self and returning &Self?

@TheBlueMattTheBlueMattFeb 24, 2022

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

I'd tried that and realized you still have to declare the variable but you're right, you can at least then be able to chain two setters which is nice. That said, its hard to map that in language bindings, cause we don't have first-class support for references in client languages.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Yea, that'd be cool, I'd think we'd have to use macros, tho maybe we can override |, as ugly as that is.

Comment on lines 321 to 328
/// Set this feature as optional.
pub fn $optional_setter(mut self) -> Self {
pub fn $optional_setter(&mut self) {
<T as $feature>::set_optional_bit(&mut self.flags);
self
}

/// Set this feature as required.
pub fn $required_setter(mut self) -> Self {
pub fn $required_setter(&mut self) {
<T as $feature>::set_required_bit(&mut self.flags);
self
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

In addition to the updated mutators, I wonder if we should have a different notation for initialization. Something like:

let features = InvoiceFeatures:from_bits(VariableLengthOnion::required() | PaymentSecret::required());

Would still need to do it in such away that it could be checked at compile time, of course.

@jkczyz
jkczyz merged commit ca163c3 into lightningdevkit:mainMar 11, 2022
Sign up for freeto 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.

4 participants

@TheBlueMatt@codecov-commenter@jkczyz@valentinewallace