コツコツPRを投げてたら、とあるOSSのコラボレータになれました。
こちらのコラボレータになれました。
swift-bridge
は、RustとSwiftを繋ぐffiを自動生成するツールです。swift-bridge
の紹介は別の記事でまとめようと思います。
以下はswift-bridge
を使った例です。
//Rust
#[swift_bridge::bridge]
mod ffi {
enum SomeEnum {
Variant1
Variant2 {
value: usize
}
Variant3(i32, u32)
}
extern "Rust" {
type SomeType; //不透明な型
#[swift_bridge(init)]
fn new() -> SomeType;
fn some_function(&self) -> i32;
}
}
pub SomeType(i32);
impl SomeType {
fn new() -> Self {
SomeType
}
fn some_function(&self) -> i32 {
self.0
}
}
//Swift
let someType = SomeType()
let someValue = someType.some_function()
let variant3 = SomeEnum.Variant2(value: 10)
上記を見るとわかる通り、簡単にSwiftとRustの連携が取れることがわかります。
OSSのコラボレータになれた経緯
元々、swift-bridge
には関心を持っていました。そこで、このOSSに何か自分でも貢献できることがあるのではないかと思い、good first issueから取り組むことにしました。
最初に投げたPRはこちら:
テストコードの整理とGithub Actionsに対する微修正をやりました。
次に取り組んだのはこちら:
上のPRは、swift-bridge
が提供する不透明な型のEquatable
のサポートを行っています。
他にも色々やり、少しずつこのOSSに慣れてきました。なので、難しい実装にもチャレンジするようになりました。
個人的に難しかったのは、RustとSwiftの間で、Enum
型を連携する実装です。
なぜ難しいのかと言いますと、RustとSwiftで提供されるEnum
型は、リッチな仕様であり、メモリ表現が複雑なのです。その為、実現方法を調査し、リポジトリのオーナーとこちらで簡単な議論を行いました。
しばらく淡々とissueに取り組んでいると、good first issueを書く機会を与えられました。
ただし、good first issueというラベルを行うには、権限が必要です。そこでついに、オーナーの方からコラボレータの招待メールが届きました!!!
これまで、何度かOSS貢献をやったことはありましたが、コラボレータの招待経験がなかったので、これはとても嬉しく思いました。
OSS貢献をコツコツ続けるには
興味のあるOSSを見つけ、コツコツgood first issueに取り組むのが良いのかなと思います。慣れてきたら、思い切って難しそうなものにチャレンジするとそのOSSに対する理解度が深まっていく気がします。あと、どのOSSもテストコードの追加は必須になっているはずなので、テストコードは日頃から書いておきましょう。
コードを理解するコツ
ドキュメントを読むのはもちろんのことですが、テストコードを眺め、色々と入力をいじるといいです。「こういう入力の時は、こんな出力が得られるんだな。」という知見が得られます。OSSにおいて、テストコードは仕様書としての役割を持ちます。
終わりに
これからも様々なOSSに貢献していきたいと考えています。