পোর্টালগুলি হল একটি ম্যাক অ্যাপ যা সুইফটে নির্মিত। এটি ওপেন সোর্স এবং এন্ড-টু-এন্ড এনক্রিপ্টেড ওকাম পোর্টালগুলিতে আপনার বন্ধুদের সাথে আপনার ম্যাক থেকে TCP বা HTTP পরিষেবাগুলি ব্যক্তিগতভাবে ভাগ করতে ওকাম রাস্ট লাইব্রেরি ব্যবহার করে। তাদের লোকালহোস্টে একটি ভাগ করা পরিষেবা উপস্থিত হয়!
এই পোস্টে, আমরা কীভাবে SwiftUI macOS অ্যাপটি রাস্ট কোডের সাথে ইন্টারঅ্যাক্ট করে তা খতিয়ে দেখব।
আপনি যদি ম্যাকের জন্য পোর্টালগুলি চেষ্টা করতে আগ্রহী হন। আপনি এই নিবন্ধে এটি সম্পর্কে আরও শিখতে পারেন এবং নিম্নরূপ হোমব্রু ব্যবহার করে ইনস্টল করতে পারেন:
brew install build-trust/ockam/portals
এখানে অ্যাকশনে অ্যাপ্লিকেশনটির একটি 2 মিনিটের ভিডিও রয়েছে:
পোর্টাল কার্যকারিতা ইতিমধ্যে ওকাম রাস্ট লাইব্রেরিতে প্রয়োগ করা হয়েছে। আমরা একটি দুর্দান্ত macOS-নেটিভ অভিজ্ঞতা তৈরি করার জন্য যাত্রা করেছি।
অ্যাপটি তৈরিতে আমাদের প্রথম প্রচেষ্টা ছিল Tauri ব্যবহার করে। আমরা ওকাম মরিচা লাইব্রেরি ব্যবহার করতে চেয়েছিলাম এবং আমাদের দলের বেশিরভাগ লোকেরা মরিচায় জিনিস তৈরি করতে স্বাচ্ছন্দ্যবোধ করে। এই প্রথম সংস্করণটি তৈরি করা সহজ ছিল এবং এতে আমরা চেয়েছিলাম সমস্ত মৌলিক ফাংশন ছিল। যাইহোক, অ্যাপটি ব্যবহার করার অভিজ্ঞতা দুর্দান্ত ছিল না। মেনুটি কীভাবে রেন্ডার করা হয়েছিল এবং কোনও ব্যবহারকারী মেনুটির সাথে ইন্টারঅ্যাক্ট করলে কী ঘটেছিল তার উপর Tauri শুধুমাত্র আমাদের ন্যূনতম নিয়ন্ত্রণ দিয়েছে। অ্যাপটির এই সংস্করণটি মনে হয়েছে যে এটি macOS-এর একটি 10 বছরের পুরানো সংস্করণের মধ্যে রয়েছে যখন macOS Sonoma-এ তৈরি মেনুবার আইটেমগুলি ব্যবহার করা সহজ।
আমরা বুঝতে পেরেছি যে আমরা যে সমৃদ্ধ অভিজ্ঞতা চাই তা পেতে, আমাদের অবশ্যই SwiftUI ব্যবহার করে অ্যাপটি তৈরি করতে হবে।
দুর্ভাগ্যবশত, আমরা সুইফট এবং রাস্টকে একীভূত করার জন্য একটি অফ-দ্য-শেল্ফ সমাধান খুঁজে পাইনি, যা আমাদের উভয় জগতের সেরাটি দেবে; মরিচা-এর নিরাপত্তা এবং SwiftUI-এর সমৃদ্ধ macOS-নেটিভ অভিজ্ঞতা। আরও কিছু খননের পর আমরা বুঝতে পেরেছি যে আমরা C-89 ব্যবহার করে দুটি সংযোগ করতে পারি। মরিচা সি কলিং কনভেনশনের সাথে সামঞ্জস্যপূর্ণ, এবং সুইফট অবজেক্টিভ-সি এর সাথে ইন্টারঅপারেবল, যা C-89 এর একটি সুপারসেট।
আমরা মরিচা ডেটা স্ট্রাকচার লিখেছি যা সুইফটের কাছে দুবার দৃশ্যমান হওয়া দরকার। একটি সংস্করণ মরিচা এবং ব্যবহার করা সহজ. অন্য সংস্করণটি পয়েন্টার এবং মেমরি ব্যবহার করে সি সামঞ্জস্যপূর্ণ যা ম্যালোকের সাথে ম্যানুয়ালি বরাদ্দ করা হয়। আমরা কিছু সি-সামঞ্জস্যপূর্ণ API গুলিও উন্মুক্ত করেছি যেগুলি অরক্ষিত মরিচায় কাঁচা-পয়েন্টার ব্যবহার করে তাদের সি-সামঞ্জস্যপূর্ণ সংস্করণগুলিতে রূপান্তরিত ডেটা স্ট্রাকচারগুলিকে রূপান্তর করে৷ অবশেষে আমরা সিবিন্ডজেন লাইব্রেরির সাহায্যে স্বয়ংক্রিয়ভাবে একটি সি হেডার তৈরি করেছি।
সুইফটের দিকে, আমরা সরাসরি C API গুলিকে কল করতে পারতাম, কিন্তু C ডেটা স্ট্রাকচারগুলি সুইফটের প্রথম শ্রেণীর নাগরিক নয়। এটি তাদের সুইফটইউআই কোডের মধ্যে বাজেভাবে ব্যবহার করা কঠিন করে তোলে। পরিবর্তে, আমরা সুইফটে ডাটা স্ট্রাকচার ডুপ্লিকেট করে সি এবং সুইফটের মধ্যে কনভার্ট করতে বেছে নিয়েছি। এটি বোঝা মনে হতে পারে, কিন্তু কার্যত, ভাগ করা অবস্থা প্রায়শই পরিবর্তিত হয় না। if let ...
, ForEach
, enum
ইত্যাদির মতো কনস্ট্রাক্ট ব্যবহার করে সুইফটইউআই-এ দ্রুত উপাদান তৈরি করার ক্ষমতা খুবই সহায়ক এবং ট্রেডঅফের মূল্য।
এখানে একই কাঠামোর 4টি ফর্মের একটি উদাহরণ রয়েছে:
// Rust idiomatic structure #[derive(Default, Clone, Debug, Eq, PartialEq)] pub struct LocalService { pub name: String, pub address: String, pub port: u16, pub shared_with: Vec<Invitee>, pub available: bool, } // Rust C-compatible structure #[repr(C)] pub struct LocalService { pub(super) name: *const c_char, pub(super) address: *const c_char, pub(super) port: u16, pub(super) shared_with: *const *const Invitee, pub(super) available: u8, } // Generated C header structure typedef struct C_LocalService { const char *name; const char *address; uint16_t port; const struct C_Invitee *const *shared_with; uint8_t available; } C_LocalService; // Swift idiomatic structure class LocalService { let name: String @Published var address: String? @Published var port: UInt16 @Published var sharedWith: [Invitee] @Published var available: Bool }
সুইফ্ট অ্যাপটি কম্পাইলের সময় আমাদের মরিচা lib-এর সাথে স্ট্যাটিকভাবে লিঙ্ক করা আছে। ডেটা প্রবাহ সহজ: UI ইন্টারঅ্যাকশনগুলি সুইফ্ট থেকে মরিচা-এ C API-কে কল করার মাধ্যমে ক্রিয়া হিসাবে পাঠানো হয়, পরিবর্তন ইভেন্টগুলি শুধুমাত্র মরিচা দ্বারা নির্গত হয় এবং সুইফটকে কলব্যাক ব্যবহার করে বিজ্ঞপ্তি দেওয়া হয় যা UI-তে আপডেটের দিকে নিয়ে যায়।
SwiftUI ভিউতে বেশিরভাগ কোড দেখতে অন্য যেকোনো SwiftUI অ্যাপ্লিকেশনের মতো।
VStack(alignment: .leading, spacing: 0) { Text(service.sourceName).lineLimit(1) HStack(spacing: 0) { Image(systemName: "circle.fill") .font(.system(size: 7)) .foregroundColor( service.enabled ? (service.available ? .green : .red) : .orange) if !service.enabled { Text(verbatim: "Not connected") } else { if service.available { Text(verbatim: service.address.unsafelyUnwrapped + ":" + String(service.port)) } else { Text(verbatim: "Connecting") } } } ...
আপনি যদি আরও জানতে আগ্রহী হন, তাহলে সুইফটে ocam_app_lib ক্রেট এবং পোর্টাল অ্যাপের কোডটি দেখুন। সুইফ্ট ফোল্ডারে থাকা মেকফাইলটি কীভাবে সবকিছু তৈরি এবং একসাথে সংযুক্ত করা হয় তা অন্বেষণ করার জন্য একটি ভাল জায়গা।
আপনি যদি ম্যাকের সুইফট বা রাস্ট কোডের জন্য পোর্টালগুলিতে অবদান রাখতে আগ্রহী হন, আমরা প্রতি সপ্তাহে নতুন ভাল প্রথম সমস্যাগুলি যোগ করি এবং নতুন অবদানকারীদের সাহায্য করতে পছন্দ করি। অবদানকারীদের বিরোধে আমাদের সাথে যোগ দিন।
এছাড়াও এখানে উপস্থিত হয়.