  Choreographic programming (CP) is an emerging paradigm for programming
distributed applications that run on multiple nodes. In CP, the programmer
writes one program, called a choreography, that is then transformed to
individual programs for each node via a compilation step called endpoint
projection (EPP). While CP languages have existed for over a decade,
library-level CP -- in which choreographies are expressed as programs in an
existing host language, and choreographic language constructs and EPP are
provided entirely by a host-language library -- is in its infancy.
Library-level CP has great potential, but existing implementations have
portability, efficiency, and practicality drawbacks that hinder its adoption.
  In this paper, we aim to advance the state of the art of library-level CP
with two novel techniques for choreographic library design and implementation:
endpoint projection as dependency injection (EPP-as-DI), and choreographic
enclaves. EPP-as-DI is a language-agnostic technique for implementing EPP at
the library level. Unlike existing library-level approaches, EPP-as-DI asks
little from the host language -- support for higher-order functions is all that
is required -- making it usable in a wide variety of host languages.
Choreographic enclaves are a language feature that lets the programmer define
sub-choreographies within a larger choreography. Within an enclave, "knowledge
of choice" is propagated only among the enclave's participants, enabling the
seamless use of the host language's conditional constructs while addressing the
efficiency limitations of existing library-level CP implementations.
  We implement EPP-as-DI and choreographic enclaves in ChoRus, the first CP
library for the Rust programming language. Our case studies and benchmarks
demonstrate that the usability and performance of ChoRus compares favorably to
traditional distributed programming in Rust.
