يحتوي Swim Rust SDK على إطار برمجيات لبناء التطبيقات الحكومية التي يمكن التفاعل معها عبر واجهات برمجة تطبيقات البث المتعددة. إنه مبني على أعلى وقت تشغيل Tokio غير المتزامن ووقت تشغيل Tokio مطلوب لأي تطبيق للسباحة.
يتكون كل تطبيق من عدد من الوكلاء الهادئين ، يتم تشغيل كل منها كمهمة منفصلة لـ Tokio ويمكن معالجتها بشكل فردي بواسطة URI. قد يكون للوكيل حالة عامة وخاصة على حد سواء والتي يمكن الاحتفاظ بها فقط في الذاكرة أو ، اختياريا ، في التخزين المستمر. تتكون الحالة العامة للوكيل من عدد من الممرات ، مماثلة لحقل في سجل. هناك أنواع متعددة من الممرات ، على سبيل المثال ، تحتوي الممرات التي تحتوي على قيم واحدة وتلك التي تحتوي على خريطة لأزواج القيمة الرئيسية.
يمكن ملاحظة حالة أي حارة من خلال إنشاء رابط لها (إما من مثيل وكيل آخر أو عميل مخصص). سيدفع الرابط المعمول به جميع التحديثات إلى حالة ذلك الممر إلى المشترك وسيسمح أيضًا للمشترك بطلب تغييرات على الحالة (لأنواع الممرات التي تدعم هذا). تعمل الروابط عبر اتصال توصيل ويب وتعدد الإرسال ، مما يعني أن الروابط إلى ممرات متعددة على نفس المضيف يمكن أن تشارك اتصالًا واحدًا من مقبس الويب.
الموقع | دليل المطور | مستندات API الخادم | مستندات API العميل
تنفيذ وكلاء السباحة في الصدأ
بناء تطبيق خادم السباحة
الوثائق المرجعية
يقوم تطبيق المثال التالي بتشغيل خادم Swimos يستضيف مسار وكيل واحد حيث يكون لكل مثيل وكيل حارة واحدة ، تسمى lane . في كل مرة يتم فيها إجراء تغييرات على الممر ، سيتم طباعته على وحدة التحكم بواسطة الخادم.
[ dependencies ]
swimos = { version = " 0.1.1 " , features = [ " server " , " agent " ] } use swimos :: {
agent :: {
agent_lifecycle :: HandlerContext ,
agent_model :: AgentModel ,
event_handler :: { EventHandler , HandlerActionExt } ,
lanes :: ValueLane ,
lifecycle , AgentLaneModel ,
} ,
route :: RoutePattern ,
server :: { until_termination , Server , ServerBuilder } ,
} ;
# [ tokio :: main ]
pub async fn main ( ) -> Result < ( ) , Box < dyn std :: error :: Error > > {
// An agent route consists of the agent definition and a lifecycle.
let model = AgentModel :: new ( ExampleAgent :: default , ExampleLifecycle . into_lifecycle ( ) ) ;
let server = ServerBuilder :: with_plane_name ( "Example Plane" )
. set_bind_addr ( "127.0.0.1:8080" . parse ( ) ? ) // Bind the server to this address.
. add_route ( RoutePattern :: parse_str ( "/examples/{id}" ) ? , model ) // Register the agent we have defined.
. build ( )
. await ? ;
// Run the server until we terminate it with Ctrl-C.
let ( task , handle ) = server . run ( ) ;
let ( ctrl_c_result , server_result ) = tokio :: join! ( until_termination ( handle , None ) , task ) ;
ctrl_c_result? ;
server_result? ;
Ok ( ( ) )
}
// Deriving the `AgentLaneModel` trait makes this type into an agent.
# [ derive ( AgentLaneModel ) ]
struct ExampleAgent {
lane : ValueLane < i32 > ,
}
// Any agent type can have any number of lifecycles defined for it. A lifecycle describes
// how the agent will react to events that occur as it executes.
# [ derive ( Default , Clone , Copy ) ]
struct ExampleLifecycle ;
// The `lifecycle` macro creates an method called `into_lifecycle` for the type, using the
// annotated event handlers methods in the block.
# [ lifecycle ( ExampleAgent ) ]
impl ExampleLifecycle {
# [ on_event ( lane ) ]
fn lane_event (
& self ,
context : HandlerContext < ExampleAgent > ,
value : & i32 ,
) -> impl EventHandler < ExampleAgent > {
let n = * value ;
context . get_agent_uri ( ) . and_then ( move |uri| {
context . effect ( move || {
println ! ( "Received value: {} for 'lane' on agent at URI: {}." , n , uri ) ;
} )
} )
}
} على سبيل المثال ، إذا أرسل عميل السباحة تحديثًا ، مع القيمة 5 ، إلى الوكيل في URI /examples/name for the Lane lane ، فسيتم بدء مثيل ExampleAgent ، باستخدام ExampleLifecycle ، بواسطة الخادم. سيتم بعد ذلك ضبط قيمة الممر على 5 وسيتم طباعة ما يلي على وحدة التحكم:
Received value: 5 for 'lane' on agent at URI: /examples/name.
يتوفر عدد من التطبيقات المثال في دليل example_apps الذي يوضح الميزات الفردية وكذلك التطبيقات الأكثر شمولاً.
انظر دليل التطوير.
هذا المشروع مرخص بموجب ترخيص Apache 2.0.