Rust Nibbles – Gazebo : Dupe
This article was written in collaboration with Neil Mitchell, a Software Engineer in the Developer Infrastructure organization at Facebook.
The Rust library Gazebo contains a collection of well-tested Rust utilities in the form of standalone modules. In this series of blog posts, we will cover some of the modules that make up the Gazebo library. In today’s blog, we will cover the Dupe trait. This blog is a part of our Rust Nibbles series, where we go over the various Rust libraries we have open-sourced to learn more about what motivated their creation and how one can use them.
In Rust, there are two related traits for “duplicating” a value – Copy and Clone. In Gazebo we’ve introduced a third such trait, we call Dupe, which is available from the Gazebo Prelude. Let’s go through these three traits, why we think there is value in a third such trait, and how we use it in practice.
The Copy trait represents values which can be duplicated by simply copying their bit pattern. It’s so cheap that in most cases the Rust compiler will automatically copy the values for you. In contrast, the Clone trait represents values which call a custom clone() method to duplicate themselves. As two examples of things that implement the Clone trait:
- The Rust reference-counted type Rc (and similar Arc, the atomic reference count) both support Clone, and their clone implementation bumps a reference count.
- The type Vec and String both support Clone, which allocate memory and copy the contents across, meaning that a type such as Vec<String> will typically do 1 allocation for the vector, and 1 for each string it contains.
While the Copy trait is quite well constrained, the Clone trait covers a massive variety of performance characteristics. In most cases, if you see yourself cloning a Vec<String> a lot, there’s a good chance you should put it in an Arc and make the cloning vastly cheaper. The problem comes when reading the code. At code review, we might see:
let xs = ys.clone();
That might allocate 2GB of memory. Or it might increment a counter. Figuring out which requires a lot of context. One possible solution is to explicitly use Arc::clone, e.g.:
let xs = Arc::clone(ys);
This pattern has the advantage of making the cost clear, but the disadvantage is that as soon as you wrap a type inside a struct, you can no longer call Arc::clone on it, even though the cost of cloning remains the same. This pattern breaks abstraction.
Our solution is to introduce the Dupe trait. It provides a dupe method that just forwards to clone, but we only define Dupe in cases where the cost of copying is “trivial”. In practice, that means zero allocation, and not too many reference count increments. Alas, the definition is a little imprecise, with no definition of “too many”, but it has served us well. Now, for types that implement Dupe, we see:
let xs = ys.dupe();
The dupe function is a clear sign during code review that we don’t need to worry. Having significantly reduced the number of calls to clone, we can pay much more attention to them. The code review experience has improved, letting us focus on the right things.
Gazebo also provides a Dupe derive macro, so you can write:
use gazebo::prelude::*; #[derive(Clone, Dupe)] struct MyArc(Arc<String>);
We think of the Dupe trait as part of the standard package of things that should always be available, so we included it in the gazebo::prelude module, but it can also be found standalone at gazebo::dupe::Dupe, for those who don’t want to use the rest of the Gazebo Prelude.
We hope that this blog helps you understand the Dupe trait, how to use it and gives you good insight into what it does. Look out for our next blog in this series, where we discuss the Variants module, which provides tools for working with the different variants of an enum.
Be sure to check out our previous blog in the Gazebo series to learn more about the various features the Gazebo library has to offer –
Gazebo – Prelude
About the Rust Nibbles series
We at Facebook believe that Rust is an outstanding language that shines in critical issues such as memory safety, performance and reliability. We joined the Rust Foundation to help contribute towards the growth, advancement and adoption of Rust, and towards sustainable development of open source technologies and developer communities across the world.
This blog is a part of our Rust Nibbles series, where we go over the various Rust libraries we have open-sourced to learn more about what motivated their creation and how one can use them. We hope that this series helps you create amazing projects by using these libraries and encourages you to try them out.
To learn more about Facebook Open Source, visit our open source site, subscribe to our YouTube channel, or follow us on Twitter and Facebook.
Introducing Facebook Graph API v18.0 and Marketing API v18.0

Today, we are releasing Facebook Graph API v18.0 and Marketing API v18.0. As part of this release, we are highlighting changes below that we believe are relevant to parts of our developer community. These changes include announcements, product updates, and notifications on deprecations that we believe are relevant to your application(s)’ integration with our platform.
For a complete list of all changes and their details, please visit our changelog.
General Updates
Consolidation of Audience Location Status Options for Location Targeting
As previously announced in May 2023, we have consolidated Audience Location Status to our current default option of “People living in or recently in this location” when choosing the type of audience to reach within their Location Targeting selections. This update reflects a consolidation of other previously available options and removal of our “People traveling in this location” option.
We are making this change as part of our ongoing efforts to deliver more value to businesses, simplify our ads system, and streamline our targeting options in order to increase performance efficiency and remove options that have low usage.
This update will apply to new or duplicated campaigns. Existing campaigns created prior to launch will not be entered in this new experience unless they are in draft mode or duplicated.
Add “add_security_recommendation” and “code_expiration_minutes” to WA Message Templates API
Earlier this year, we released WhatsApp’s authentication solution which enabled creating and sending authentication templates with native buttons and preset authentication messages. With the release of Graph API v18, we’re making improvements to the retrieval of authentication templates, making the end-to-end authentication template process easier for BSPs and businesses.
With Graph API v18, BSPs and businesses can have better visibility into preset authentication message template content after creation. Specifically, payloads will return preset content configuration options, in addition to the text used by WhatsApp. This improvement can enable BSPs and businesses to build “edit” UIs for authentication templates that can be constructed on top of the API.
Note that errors may occur when upgrading to Graph API v18 if BSPs or businesses are taking the entire response from the GET request and providing it back to the POST request to update templates. To resolve, the body/header/footer text fields should be dropped before passing back into the API.
Re-launching dev docs and changelogs for creating Call Ads
- Facebook Reels Placement for Call Ads
Meta is releasing the ability to deliver Call Ads through the Facebook Reels platform. Call ads allow users to call businesses in the moment of consideration when they view an ad, and help businesses drive more complex discussions with interested users. This is an opportunity for businesses to advertise with call ads based on peoples’ real-time behavior on Facebook. Under the Ad set Level within Ads Manager, businesses can choose to add “Facebook Reels” Under the Placements section. - Re-Launching Call Ads via API
On September 12, 2023, we’re providing updated guidance on how to create Call Ads via the API. We are introducing documentation solely for Call Ads, so that 3P developers can more easily create Call Ads’ campaigns and know how to view insights about their ongoing call ad campaigns, including call-related metrics. In the future, we also plan to support Call Add-ons via our API platform. Developers should have access to the general permissions necessary to create general ads in order to create Call Ads via the API platform.Please refer to developer documentation for additional information.
Deprecations & Breaking Changes
Graph API changes for user granular permission feature
We are updating two graph API endpoints for WhatsAppBusinessAccount. These endpoints are as follows:
- Retrieve message templates associated with WhatsAppBusiness Account
- Retrieve phone numbers associated with WhatsAppBusiness Account
With v18, we are rolling out a new feature “user granular permission”. All existing users who are already added to WhatsAppBusinessAccount will be backfilled and will continue to have access (no impact).
The admin has the flexibility to change these permissions. If the admin changes the permission and removes access to view message templates or phone numbers for one of their users, that specific user will start getting an error message saying you do not have permission to view message templates or phone numbers on all versions v18 and older.
Deprecate legacy metrics naming for IG Media and User Insights
Starting on September 12, Instagram will remove duplicative and legacy, insights metrics from the Instagram Graph API in order to share a single source of metrics to our developers.
This new upgrade reduces any confusion as well as increases the reliability and quality of our reporting.
After 90 days of this launch (i.e. December 11, 2023), we will remove all these duplicative and legacy insights metrics from the Instagram Graph API on all versions in order to be more consistent with the Instagram app.
We appreciate all the feedback that we’ve received from our developer community, and look forward to continuing to work together.
Please review the media insights and user insights developer documentation to learn more.
Deprecate all Facebook Wi-Fi v1 and Facebook Wi-Fi v2 endpoints
Facebook Wi-Fi was designed to improve the experience of connecting to Wi-Fi hotspots at businesses. It allowed a merchant’s customers to get free Wi-Fi simply by checking in on Facebook. It also allowed merchants to control who could use their Wi-Fi and for how long, and integrated with ads to enable targeting to customers who had used the merchant’s Wi-Fi. This product was deprecated on June 12, 2023. As the partner notice period has ended, all endpoints used by Facebook Wi-Fi v1 and Facebook Wi-Fi v2 have been deprecated and removed.
API Version Deprecations:
As part of Facebook’s versioning schedule for Graph API and Marketing API, please note the upcoming deprecations:
Graph API
- September 14, 2023: Graph API v11.0 will be deprecated and removed from the platform
- February 8, 2024: Graph API v12.0 will be deprecated and removed from the platform
- May 28, 2024: Graph API v13.0 will be deprecated and removed from the platform
Marketing API
- September 20, 2023: Marketing API v14.0 will be deprecated and removed from the platform
- September 20, 2023: Marketing API v15.0 will be deprecated and removed from the platform
- February 06, 2024: Marketing API v16.0 will be deprecated and removed from the platform
To avoid disruption to your business, we recommend migrating all calls to the latest API version that launched today.
Facebook Platform SDK
As part of our 2-year deprecation schedule for Platform SDKs, please note the upcoming deprecations and sunsets:
- October 2023: Facebook Platform SDK v11.0 or below will be sunset
- February 2024: Facebook Platform SDK v12.0 or below will be sunset
First seen at developers.facebook.com
Allowing Users to Promote Stories as Ads (via Marketing API)

Before today (August 28, 2023), advertisers could not promote images and/or videos used in Instagram Stories as ads via the Instagram Marketing API. This process created unwanted friction for our partners and their customers.
After consistently hearing about this pain point from our developer community, we have removed this unwanted friction for advertisers and now allow users to seamlessly promote their image and/or video media used in Instagram Stories as ads via the Instagram Marketing API as of August 28, 2023.
We appreciate all the feedback received from our developer community, and hope to continue improving your experience.
Please review the developer documentation to learn more.
First seen at developers.facebook.com
Launching second release of Facebook Reels API: An enterprise solution for desktop and web publishers

We’re excited to announce that the second release of FB Reels API is now publicly available for third-party developers. FB Reels API enables users of third-party platforms to share Reels directly to public Facebook Pages and the New Pages Experience.
FB Reels API has grown significantly since the first release in September 2022. The new version of the APIs now support custom thumbnails, automatic music tagging, tagging collaborators, longer format of reels and better error handling.
FB Reels API will also support scheduling and draft capability to allow creators to take advantage of tools provided either by Meta or by our partners. Based on the feedback we received from our partners, we’ll now provide additional audio insights via the Audio Recommendations API and reels performance metrics via the Insights API.
Our goal in the next couple of releases is to continue to make it easier for creators to develop quality content by adding features like early copyright detection and A/B testing. We’re also excited to start working on enhanced creation features like Video clipping- so stay tuned to hear more about those features in the future.
Call-to-Action
If you are a developer interested in integrating with the Facebook Reels API, please refer to the Developer Documents for more info.
Not sure if this product is for you? Check out our entire suite of sharing offerings.
Tune in to Product @scale event to learn more about FB Video APIs and hear from some of our customers.
First seen at developers.facebook.com
-
Uncategorized1 week ago
3 Ways To Find Your Instagram Reels History
-
Uncategorized2 weeks ago
Social Media for Business: A Practical Guide
-
OTHER2 weeks ago
WhatsApp Chat Interoperability Feature Spotted in Development on Latest Beta Update: Report
-
FACEBOOK1 week ago
Introducing Facebook Graph API v18.0 and Marketing API v18.0
-
OTHER2 weeks ago
YouTube ‘Subscribe’ Button Spotted to Be Glowing When Creators Request Subscription
-
Uncategorized1 week ago
Community Manager: Job Description & Key Responsibilities
-
LINKEDIN1 week ago
Career Stories: Learning and growing through mentorship and community
-
Uncategorized7 days ago
The Complete Guide to Social Media Video Specs in 2023