コツコツ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に貢献していきたいと考えています。
