11use curl:: easy:: { Easy , List } ;
22use neon:: prelude:: * ;
3+ use pulldown_cmark:: { Event , Options , Parser , Tag , TagEnd } ;
34use serde_json:: to_string;
4- use pulldown_cmark:: { Event , Parser , Tag , TagEnd , Options } ;
55
66mod request;
77mod response;
88use request:: * ;
9- // use response::Response;
109
1110#[ neon:: main]
1211fn main ( mut cx : ModuleContext ) -> NeonResult < ( ) > {
1312 cx. export_function ( "generate_content" , generate_content) ?;
14- cx. export_function ( "markdown_to_text" , markdown_to_text) ?;
1513 Ok ( ( ) )
1614}
1715
18- // @args api_key: String, prompt: &str
19- pub fn generate_content ( mut cx : FunctionContext ) -> JsResult < JsString > {
16+ pub fn generate_content ( mut cx : FunctionContext ) -> JsResult < JsObject > {
2017 let api_key = cx. argument :: < JsString > ( 0 ) ?. value ( & mut cx) ;
2118 let prompt = cx. argument :: < JsString > ( 1 ) ?. value ( & mut cx) ;
2219
@@ -56,13 +53,13 @@ pub fn generate_content(mut cx: FunctionContext) -> JsResult<JsString> {
5653 }
5754
5855 let json_data = String :: from_utf8 ( response_data) . unwrap ( ) ;
59- // let response: Response = serde_json::from_str(json_data.as_str()).unwrap();
60- // response
61- Ok ( cx. string ( json_data) )
56+ let response: response:: Response = serde_json:: from_str ( json_data. as_str ( ) ) . unwrap ( ) ;
57+ let js_res_obj = to_jsobj ( cx, response) ;
58+
59+ Ok ( js_res_obj. unwrap ( ) )
6260}
6361
64- pub fn markdown_to_text ( mut cx : FunctionContext ) -> JsResult < JsString > {
65- let markdown = cx. argument :: < JsString > ( 0 ) ?. value ( & mut cx) ;
62+ pub fn markdown_to_text ( markdown : & str ) -> String {
6663 let options = Options :: empty ( ) ;
6764 let parser = Parser :: new_ext ( & markdown, options) ;
6865 let mut plain_text = String :: new ( ) ;
@@ -71,18 +68,40 @@ pub fn markdown_to_text(mut cx: FunctionContext) -> JsResult<JsString> {
7168 match event {
7269 Event :: Text ( text) | Event :: Code ( text) => plain_text. push_str ( & text) ,
7370 Event :: Start ( tag) => match tag {
74- Tag :: Paragraph | Tag :: Heading { .. } => plain_text. push_str ( "\n \n " ) ,
71+ Tag :: Paragraph | Tag :: Heading { .. } => plain_text. push_str ( "\n \n " ) ,
7572 Tag :: List ( _) => plain_text. push ( '\n' ) ,
7673 Tag :: Item => plain_text. push_str ( "\n • " ) ,
77- _ => { } ,
74+ _ => { }
7875 } ,
7976 Event :: End ( tag) => match tag {
80- TagEnd :: Paragraph | TagEnd :: Heading { .. } => plain_text. push ( '\n' ) ,
81- _ => { } ,
77+ TagEnd :: Paragraph | TagEnd :: Heading { .. } => plain_text. push ( '\n' ) ,
78+ _ => { }
8279 } ,
8380 _ => { }
8481 }
8582 }
8683
87- Ok ( cx. string ( plain_text) )
84+ plain_text
85+ }
86+
87+ fn to_jsobj ( mut cx : FunctionContext , res : response:: Response ) -> JsResult < JsObject > {
88+ let obj = cx. empty_object ( ) ;
89+
90+ let text = cx. string ( markdown_to_text ( & res. candidates [ 0 ] . content . parts [ 0 ] . text ) ) ;
91+ obj. set ( & mut cx, "text" , text) ?;
92+
93+ let finish_reason = cx. string ( & res. candidates [ 0 ] . finishReason ) ;
94+ obj. set ( & mut cx, "finish_reason" , finish_reason) ?;
95+
96+ let usage_metadata = cx. string ( to_string ( & res. usageMetadata ) . unwrap ( ) ) ;
97+ obj. set ( & mut cx, "usage_metadata" , usage_metadata) ?;
98+
99+ let role = cx. string ( & res. candidates [ 0 ] . content . role ) ;
100+ obj. set ( & mut cx, "role" , role) ?;
101+
102+ let prompt_feedback = to_string ( & res. candidates [ 0 ] . safetyRatings ) . unwrap ( ) ;
103+ let prompt_feedback_str = cx. string ( prompt_feedback) ;
104+ obj. set ( & mut cx, "prompt_feedback" , prompt_feedback_str) ?;
105+
106+ Ok ( obj)
88107}
0 commit comments