@@ -268,6 +268,7 @@ impl AnilistClient {
268268 full
269269 native
270270 alternative
271+ alternativeSpoiler
271272 first
272273 last
273274 }
@@ -412,6 +413,16 @@ impl AnilistClient {
412413 } )
413414 . unwrap_or_default ( ) ;
414415
416+ let spoiler_alternatives: Vec < String > = name_data[ "alternativeSpoiler" ]
417+ . as_array ( )
418+ . map ( |arr| {
419+ arr. iter ( )
420+ . filter_map ( |v| v. as_str ( ) . map ( |s| s. to_string ( ) ) )
421+ . filter ( |s| !s. is_empty ( ) )
422+ . collect ( )
423+ } )
424+ . unwrap_or_default ( ) ;
425+
415426 // Gender: "Male" → "m", "Female" → "f"
416427 let sex = node. get ( "gender" ) . and_then ( |g| g. as_str ( ) ) . and_then ( |g| {
417428 match g. to_lowercase ( ) . chars ( ) . next ( ) {
@@ -482,6 +493,7 @@ impl AnilistClient {
482493 . and_then ( |v| v. as_str ( ) )
483494 . map ( |s| s. to_string ( ) ) ,
484495 aliases : alternatives,
496+ spoiler_aliases : spoiler_alternatives,
485497 personality : Vec :: new ( ) , // AniList has no trait categories
486498 roles : Vec :: new ( ) ,
487499 engages_in : Vec :: new ( ) ,
@@ -1638,6 +1650,77 @@ mod tests {
16381650 assert_eq ! ( ch. aliases, vec![ "Valid" , "Also Valid" ] ) ;
16391651 }
16401652
1653+ #[ test]
1654+ fn test_process_character_spoiler_alternatives ( ) {
1655+ let client = make_client ( ) ;
1656+ let mut edge = make_edge (
1657+ ROLE_MAIN ,
1658+ 1 ,
1659+ "Test Character" ,
1660+ "テスト" ,
1661+ None ,
1662+ None ,
1663+ None ,
1664+ None ,
1665+ None ,
1666+ vec ! [ "Normal Alt" ] ,
1667+ None ,
1668+ ) ;
1669+ edge[ "node" ] [ "name" ] [ "alternativeSpoiler" ] =
1670+ serde_json:: json!( [ "Spoiler Name" , "Another Spoiler" ] ) ;
1671+ let ch = client. process_character ( & edge) . unwrap ( ) ;
1672+ assert_eq ! ( ch. aliases, vec![ "Normal Alt" ] ) ;
1673+ assert_eq ! (
1674+ ch. spoiler_aliases,
1675+ vec![ "Spoiler Name" , "Another Spoiler" ]
1676+ ) ;
1677+ }
1678+
1679+ #[ test]
1680+ fn test_process_character_spoiler_alternatives_with_nulls ( ) {
1681+ let client = make_client ( ) ;
1682+ let mut edge = make_edge (
1683+ ROLE_MAIN ,
1684+ 1 ,
1685+ "A" ,
1686+ "あ" ,
1687+ None ,
1688+ None ,
1689+ None ,
1690+ None ,
1691+ None ,
1692+ vec ! [ ] ,
1693+ None ,
1694+ ) ;
1695+ edge[ "node" ] [ "name" ] [ "alternativeSpoiler" ] =
1696+ serde_json:: json!( [ null, "Valid Spoiler" , null, "" ] ) ;
1697+ let ch = client. process_character ( & edge) . unwrap ( ) ;
1698+ assert_eq ! ( ch. spoiler_aliases, vec![ "Valid Spoiler" ] ) ;
1699+ }
1700+
1701+ #[ test]
1702+ fn test_process_character_no_spoiler_alternatives ( ) {
1703+ let client = make_client ( ) ;
1704+ let edge = make_edge (
1705+ ROLE_MAIN ,
1706+ 1 ,
1707+ "A" ,
1708+ "あ" ,
1709+ None ,
1710+ None ,
1711+ None ,
1712+ None ,
1713+ None ,
1714+ vec ! [ ] ,
1715+ None ,
1716+ ) ;
1717+ let ch = client. process_character ( & edge) . unwrap ( ) ;
1718+ assert ! (
1719+ ch. spoiler_aliases. is_empty( ) ,
1720+ "Missing alternativeSpoiler should produce empty vec"
1721+ ) ;
1722+ }
1723+
16411724 // === Edge case: hasNextPage missing ===
16421725
16431726 #[ test]
0 commit comments